大家好,我是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核心技术与实战》
作者:周旭龙
出处:https://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
标签:search,Elastic,GET,查询,DSL,query,Query,match From: https://www.cnblogs.com/edisonchou/p/-/edc_elastic_study_notes_chap06