Query DSL——Query Domain Special Language
什么是结构化查询
结构化查询是一种灵活的、多表现形式的查询语言
ES在一个简单的JSON接口中用结构化查询来展现Lucene的绝大多数能力
使用结构化查询,需要传递query参数
GET /_search
{
"query":{}
}
空查询-{}-在功能上等同于使用match_all查询子句,匹配所有的文档
GET /_search
{
"query":{
"match_all":{}
}
}
查询子句
叶查询子句:在特定的字段上查找特定的值。如:match、term、range子句,这些查询可以自己使用
{
"query":{
"match":{
"tweet":"elasticsearch"
}
}
}
合并多子句
合并多子句(复合查询子句):包含其他叶查询或复合查询子句,以合理的方式结合多条查询(如bool或dis_max查询),或者改变查询行为(比如constant_score查询)
{
"query": {
"bool": {
"must": { "match": {"interests": "music"}},
"must_not": {"match": {"about": "swimming"}}
}
}
}
查询和过滤
查询和过滤的区别
一条过滤语句会询问每个文档的字段值是否包含着特定值
查询语句会询问每个文档的字段值与特定值的匹配程度如何
查询语句会计算每个文档与查询语句的相关性,给出一个相关性评分_score
,并且按照相关性对匹配到的文档进行排序
什么时候使用
原则上来说,使用查询语句做全文搜索或其他需要相关性评分的时候,剩下的全部用过滤语句
匹配所有的查询
match_all
match_all匹配所有文档
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"match_all": {}
}
}
match_all的boost参数可以用来改变_score
match_none
match_none是match_all查询相反的语句,不匹配文档
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"match_none": {}
}
}
全文本搜索
在文本字段上执行全文搜索
match
match查询接受文本/数字/日期的查询,分析参数并组成查询条件
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"match": {
"about": "collect"
}
}
}
默认的标准查询类型,分析文本并组成一个布尔查询。operator参数可以设置为or或者and来控制布尔子句(默认为or)。用于匹配的should子句(可选)的最小数量可以使用minimum_should_match参数来设置
模糊匹配
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"match": {
"about": {
"query": "go swimming",
"operator": "and"
}
}
}
}
零索引词查询
zero_terms_query,修改其值为no或all,来控制是否匹配所有文档或不匹配文档
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"match": {
"about": {
"query": "go swimming",
"operator": "and",
"zero_terms_query": "all"
}
}
}
}
match_phrase
短语查询分析文本并创建短语查询,根据短语匹配查询,默认不执行分析查询
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"match_phrase": {
"about": "go swimming"
}
}
}
可以设置analyzer参数来控制将要在文本上执行分词的分词器,默认是字段映射中定义的分词器
match_phrase_prefix
可以对文本最后一个字段进行前缀匹配
#匹配字段about值中前缀为I love to go的文档
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"match_phrase_prefix": {
"about": "I love to go"
}
}
}
multi_match
在标准查询的基础上支持多字段查询
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"multi_match": {
"query": "I love to go",
"fields": [
"about",
"interests"
]
}
}
}
支持通配符
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"multi_match": {
"query": "go",
"fields": [
"about", "*_name"
]
}
}
}
个别字段可以用caret(^)加权
#about字段比*_name重要3倍
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"multi_match": {
"query": "go",
"fields": [
"about^3",
"*_name"
]
}
}
}
common_terms
query_string
使用语法分析器来分析内容进行查询
#default_field:指定要查询的字段,默认是_all
#query:实际被解析的查询
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"query_string": {
"default_field": "about",
"query": "go AND to"
}
}
}
多字段执行query_string的意义在于可以使用OR子句扩展每个查询索引词
simple_query_string
系统提供了简化语法来进行查询,简化查询不会抛出异常,而且会丢弃查询无效部分
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"simple_query_string": {
"query": "\"go\"",
"analyzer": "snowball",
"fields": [
"about^5",
"_all"
],
"default_operator": "and"
}
}
}
字段查询
term
根据指定字段中包含的指定内容查询
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"term": {
"interests": "music"
}
}
}
terms
多字段查询
过滤文档,文档字段匹配任何提供的索引词
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"constant_score": {
"filter": {
"terms": {
"interests": ["music","yoga"]
}
}
}
}
}
range
范围查询
根据指定字段包含的值(日期、数字或字符串)范围查找文档
Lucene查询类型取决于字段类型,对于字符串类型字段,使用TermRangeQuery;对于数字/日期类型字段,使用NumericRangeQuery
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"range": {
"age": {
"gt": 25
}
}
}
}
范围查询接受的参数如下:
- gte——大于或等于
- gt——大于
- lte——小于或等于
- lt——小于
- boost——设置查询的加权值,默认1.0
日期型字段范围
当在日期型字段上运行范围查询,可以使用名为“日期匹配”的分段来指定范围。
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"range": {
"create_time": {
"gte": "now-3d/d"
}
}
}
}
- +1h - add one hour
- -1d - subtract one day
-
/d - round down to the nearest day
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"range": {
"create_time": {
"gte": "2019-05-07 00:00:00||/M"
}
}
}
}
exists
查找指定字段包含任何非空值的文档
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"exists": {
"field": "about"
}
}
}
匹配查询的文档:
{ "about": "jane" }
{ "about": "" }
{ "about": "-" }
{ "about": ["jane"] }
{ "about": ["jane", null ] }
不匹配查询的文档:
{ "about": null }
{ "about": [] }
{ "about": [null] }
{ "foo": "bar" }
prefix
前缀查询,匹配文档,字段包含拥有特定前缀的索引词(不分词)
POST http://localhost:9200/megcorp/employee/_search
{
"query": {
"prefix": {
"interests": "mu"
}
}
}
wildcard
匹配文档,字段匹配通配符表达式(不分词)
通配符:*,匹配任意字符
通配符:?,匹配任何单个字符
{
"query": {
"wildcard": {
"interests": "re*ing"
}
}
}
regexp
正则查询,字段匹配正则表达式
{
"query": {
"regexp": {
"interests": "re.*ing"
}
}
}
fuzzy
模糊查询对字符串字段使用基于编辑距离的相似性,以及数字型和日期型字段的正负范围进行匹配
{
"query": {
"fuzzy": {
"last_name": "Li"
}
}
}
高级用法,其中:
fuzziness:最大编辑距离,默认AUTO
prefix_length:不会被模糊化的最初字符数量,可以用来减少必须审查的索引词数量,默认是0
max_expansions:模糊查询将要扩展的索引词最大数量,默认是50
{
"query": {
"fuzzy": {
"last_name": {
"value": "Li",
"boost": 1,
"fuzziness": 2,
"prefix_length": 0,
"max_expansions": 100
}
}
}
}
type
根据匹配提供的映射类型查询
{
"query": {
"type": {
"value": "employee"
}
}
}
其中:value值为映射类型名
ids
获取只拥有提供的主键的文档
注意:查询使用_uid字段
{
"query": {
"ids": {
"type": "employee",
"values": [1,2,7]
}
}
}
其中:
type字段是可选的,也可以接受数组形式的值;如果没有指定类型,所有定义在索引映射中的类型都会被尝试。
复合查询
常数得分查询
https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-constant-score-query.html
布尔查询
获取匹配其他查询的布尔值的文档。基于一个或多个布尔子句的使用,每个子句都有一类事件:
- must——必须出现在匹配文档中,并且会影响匹配得分
- filter——必须出现在匹配文档中,匹配得分将会被忽略
- should——应该出现在匹配文档中,在布尔查询中如果没有must或filter子句,文档必须匹配一个或多个should子句。
- must_not——必须不出现在匹配文档中
tips
如果查询用于过滤内容而且有should子句,那么至少有一个should子句被匹配
{
"query": {
"bool": {
"must": {
"term": {
"about": "to"
}
},
"filter": {
"term": {
"type": "info"
}
},
"must_not": {
"range": {
"age": {
"gte": 40,
"lt": 50
}
}
},
"should": {
"term": {
"about": "build"
}
},
"minimum_should_match": 1,
"boost": 1
}
}
}