Elastic学习之旅 (6) Query DSL
大家好,我是Edison。首先说声抱歉,这个ES学习系列很久没更新了,现在继续吧。
上一篇:ES的倒排索引和Analyzer
什么是Query DSL
DSL是Domain Specific Language的缩写,指的是为特定问题领域设计的计算机语言。这种语言专注于某特定领域的问题解决,因而比通用编程语言更有效率。
在ElasticSearch中,DSL指的是Elasticsearch Query DSL,是一种以JSON形式表示的查询语言。通过这种语言,用户可以构建复杂的查询、排序和过滤数据等操作。这些查询可以是全文搜索、聚合搜索,也可以是结构化的搜索。
Elastic Query DSL的基本语法如下:
# 基本格式
GET /es_db/_doc/_search {json-request-body}
# 简化格式
GET /es_db/_search {json-request-body}
match_all
使用match_all就类似于SQL中的SELECT *了,它会匹配所有文档,但默认只会返回10条数据。这是因为,_search查询默认采用的是分页查询,每页size默认值就是10,因此如果想显示更多,请制定size。
// 匹配所有文档,默认分页只返回10条
GET users/_search
{
"query":
{
"match_all":{}
}
}
// 设置分页的每页条数size值为20
GET users/_search
{
"query":
{
"match_all":{}
},
"size": 20
}
分页查询 from & size & sort
分页查询最重要的3个参数:from 、size 和 sort。
from: 显示应该跳过的初始结果数量,默认是0。
size: 显示应该返回的结果数量,默认是10,刚刚有演示。
sort: 根据什么字段 以及 升序 或 降序 来排序。
// 从第5个文档开始取10个显示,并根据用户名升序排列
GET users/_search
{
"query":
{
"match_all":{}
},
"sort":
{
"user": "asc"
}
"from": 5
"size": 20
}
_source 过滤
_source参数就好比SELECT field1, field2,当我们需要只查询某些特定字段时,就可以使用_source参数来进行过滤。_source支持使用通配符,可以较为方便的编写,如:_source["name*","desc*"]。
# 只查询users中的user和message两个字段数据,过滤掉其他字段
GET users/_search
{
"_source": ["user","message"],
"query":
{
"match_all":{}
},
"from": 0,
"size": 20
}
match 查询表达式
match 查询表达式可能是我们用的最多的参数了,它会在匹配时对所查找的关键词进行分词,然后按照分词匹配查找。
match 支持以下参数:
query 指定匹配的值
operator 匹配条件类型
and 条件分词后都要匹配
or 条件分词后有一个匹配即可(默认的operator类型)
// 默认为or => comments字段中有文档出现任意一个Song or Last or Christmas
GET comments/_search
{
"query":
{
"match":
{
"comment":
{
"query": "Song Last Christmas"
}
}
}
} // 手动指定and => comments字段中有文档同时出现Song Last Christmas
GET comments/_search
{
"query":
{
"match":
{
"comment":
{
"query": "Song Last Christmas",
"operator": "and"
}
}
}
}
multi_match 多字段查询表达式
上面演示的是针对单个字段的查询,那么如果想要针对多个字段查询呢?
使用multi_match即可,指定fields:
GET comments/_search
{
"query":
{
"multi_match":
{
"query": "Song Last Christmas",
"fields": ["comments", "address"]
}
}
}
match_phrase 短语查询表达式
短语查询会对搜索文本进行文本分析,然后才到索引中寻找搜索的每个分词并要求分词相邻。我们可以通过slop参数设置分词出现的最大间隔距离,可以通过下面的例子来看看。
// 查询one love这个短语出现过的文档
POST movies/_search
{
"query":
{
"match_phrase": {
"title": {
"query": "one love"
}
}
}
}
// 只要one和love之间间隔不超过1个词就都显示出来
POST movies/_search
{
"query":
{
"match_phrase": {
"title": {
"query": "one love",
"slop": 1
}
}
}
}
搜索结果:One I Love

query_string 与 simple_query_string
Query String类似于URI Query,这种查询方式的语法和我们在SQL中的WHERE语句就有些类似了,基于OR/AND/NOT等运算符来解析和拆分提供的查询字符串,我们可以使用 Query String 查询创建一个较为复杂的搜索,其中可以包括通配符、跨多个字段的搜索等。
虽然用途广泛,但是语法较为严格,容易出错,不推荐在日常查询中使用。
// 查询单个字段
GET /bank/_search
{
"query": {
"query_string": {
"default_field": "address",
"query": "Chengdu AND Shuangliu"
}
}
} // 查询多个字段
GET /bank/_search
{
"query": {
"query_string": {
"fields": ["name", "address"],
"query": "(Edison AND Zhou) OR (Chengdu AND Shuangliu)"
}
}
}
Simple Query String 顾名思义 就是简单版Query String,它类似于Query String但会忽略错误的语法。此外,它不支持AND OR NOT,会将它们当作字符串来处理。各个Term之间默认的关系是OR,但可以指定Operator来覆盖。
// 默认operator是OR => 出现其一即可 Edison or Zhou
GET /bank/_search
{
"query": {
"simple_query_string": {
"query": "Edison Zhou",
"fields": ["name"]
}
}
}
// 覆盖默认operator 改为AND => 必须完整出现 Edison Zhou
GET /bank/_search
{
"query": {
"simple_query_string": {
"query": "Edison Zhou",
"fields": ["name"],
"default_operator": "AND"
}
}
}
小结
本篇,我们了解了ElasticSearch的Query DSL,并通过一些查询示例了解了如何使用它。除了本文中介绍的部分高频DSL外,你可以通过搜索阅读其他的关键词进行学习。
参考资料
极客时间,阮一鸣,《ElasticSearch核心技术与实战》

Elastic学习之旅 (6) Query DSL的更多相关文章
- Elasticsearch学习笔记(二)Search API 与 Query DSL
一. Search API eg: GET /mall/product/_search?q=name:productName&sort=price desc 特点:search的请求参数都是以 ...
- Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
目录 引言 构建示例 match operator 参数 analyzer lenient 参数 Fuzziness fuzzniess 参数 什么是模糊搜索? Levenshtein Edit Di ...
- 48.Query DSL
主要知识点 1.Query DSL的理解及基本语法 2.如何组合多个搜索条件 bool 一.Query DSL的理解 Query DSL的查询形式如下: GET /_search { &quo ...
- 我的AngularJS 学习之旅
我的AngularJS 学习之旅 基础篇 1.Angular的 起源 2.比较Web 页面实现的几种方式 3.一些基本术语 4.Angular与其他框架的兼容性 5.总结 6.综合实例 很早之前就 ...
- Elasticsearch(入门篇)——Query DSL与查询行为
ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...
- Query DSL(1)
https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl.html Query DSL GET _search { & ...
- 开发了5年android,我开始了go学习之旅
前言 做了近5年的android开发,最近项目也是不怎么忙,空闲的时候总会思考一些事情,不过作为移动开发,我个人觉得很有必要学习后台开发,由于公司是Go语言开发的,了解go语言一段时间后,我发现go语 ...
- elasticsearch系列四:搜索详解(搜索API、Query DSL)
一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...
- Elasticsearch Query DSL查询入门
本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...
- elasticsearch入门使用(三) Query DSL
Elasticsearch Reference [6.2] » Query DSL 参考官方文档 :https://www.elastic.co/guide/en/elasticsearch/refe ...
随机推荐
- .NET Core & ConsoleApp & appsettings.json
准备 Visual Studio 2017 .NET Core 2.1 新建控制台应用(.NET Core) 默认的 Program.cs // Program.cs using System; na ...
- Ubuntu下RabbitVCS的安装和简单使用
最近需要在Ubuntu下玩一段时间,但是没找类似TortoiseSVN的熟悉点的Subversion工具,无意间发现了RabbitVCS,操作上非常nice,留爪. 下载 RabbitVCS Rabb ...
- Ubuntu下Ibus和fcitx的奇葩问题
最近装了个Ubuntu,捉鸡的输入法令人哀伤. 于是乎,卸载了自带Ibus和fcitx出现各种问题,留爪. 首先,卸载了Ibus,会出现的问题如下: 注销/重启系统有问题 系统设置菜单选项缺失 -&g ...
- python练习-爬虫(续)
流程: 1 设置url 2 设置消息头 3 设置消息体 4 获取响应 5 解析相应 6 验证数据 接下来就是查询数据了. # 识别图片中的文字 #image = Image.open('captcha ...
- P3392 涂国旗 题解
题目大意 题目真的是不说人话...... 有一个国家的国旗是由一个 N * M 的方格组成的.如果想要这面国旗合法,就必须满足要求: 国旗从上到下必须是白色.蓝色和红色,顺序不能改变. 每一种颜色都至 ...
- adb环境配置笔记
adb环境配置不需要先配置好jdk,然后配置adb环境,才能命令行运行adb https://blog.csdn.net/shengmer/article/details/79027828 https ...
- Debug调试(使用IDEA的断点调试功能,查看程序的运行过程)
一. 1. 在有效代码行,点击行号右边的空白区域,设置断点,程序执行到断点将停止,我们可以手动来运行程序 2. 点击Debug运行模式 3. 程序停止在断点上不再执行,而IDEA最下方打开了Debug ...
- Java高效合并Excel报表实战:GcExcel让数据处理更简单
前言:为什么需要自动化合并Excel? 在日常办公场景中,Excel报表合并是数据分析的基础操作.根据2023年企业办公效率报告显示: 财务人员平均每周花费6.2小时在Excel合并操作上 人工合并的 ...
- js移动端判断跳转
js移动端判断跳转,只一行 默默收藏 if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobil ...
- 可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)
1. 题目 描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 数据范围:0≤n≤1500,树上每个节点的val满足 |val| <= 1500 ...