本文基于官方文档学习:
https://www.elastic.co/guide/en/elasticsearch/reference/7.6/query-dsl.html
Query DSL
es提供了一套基于json的完整的Query DSL(Domain Specific Language).
叶子查询语句:
叶查询子句中寻找一个特定的值在某一特定领域,如 match,term或 range查询。这些查询可以自己使用
符合查询语句:
复合查询子句包装其他叶查询或复合查询,并用于以逻辑方式组合多个查询(例如 bool或dis_max查询),或更改其行为(例如 constant_score查询)
查询子句的行为会有所不同,具体取决于它们是在 查询上下文中还是在过滤器上下文中使用
查询和过滤上下文
相关性分数( Relevance scores)
默认情况下,es按关联分数对匹配的结果进行排序,这个分数衡量每个文档和查询的匹配度
相关性分数是一个正浮点数,在search api中_score
元字段中返回,_score
值越高,文档越相关。尽管不同查询类型可以不同得计算相关性分数,但是相关性分数还是取决于查询子句是在query
还是filter
上下文中。
Query Context
在查询上下文中,查询子句回答“此文档与该查询子句得匹配度”的问题,除此之外,查询子句还计算_score
元字段中得相关性分数。
Filter Context
在过滤上下文中,查询子句主要回答“此文档与该查询是否匹配”的问题,不用计算分数,主要用来过滤结构化的数据
常用过滤器会被es自动缓存,以提高性能
案例
GET /_search
{
"query": { ------------1
"bool": { ------------2
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [ --------------3
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
query
表示这是一个查询上下文bool
和match
在查询上下文中使用,被用来计算每个文档的匹配度,即相关性分数filter
参数表示这个是过滤上下文,term
和range
用于过滤上下文中,它们过滤出不匹配的文档,并不影响相关性分数
复合查询
复合查询用来包装其他复合查询或者叶查询,以及组合它们的结果和分数,来改变其行为表现,或者从查询切换到过滤上下文,查询包含以下:
Bolean query
布尔查询由一个或者多个子句组成,每个子句有特定的类型
类型 | 描述 |
---|---|
must | 返回文档必须满足must 子句的条件,并且参与计算分数 |
filter | 返回的文档必须满足filter 子句的条件,但是不会像must 一样,参与计算分值 |
should | 返回文档可能满足should 子句的条件 |
must_not | 返回文档不必满足must_not 子句的条件,子句在filter context 意味着不计分,并且会缓存。由于分数被忽略,所以所有文档的分数都是0 |
布尔查询采用more-matches-is-better
策略,因此must
和should
子句的分数会被加起来,为每个文档提供最终的_score
值
使用minimum_should_match
你可以使用minimum_should_match参数指定返回的文档必须匹配的应当子句的数量或百分比
如果布尔查询中,包含至少一个should
子句,并且没有must
和filter
子句,默认值就是1,否则就是0
更多信息,请参看:minimum_should_match
用bool.filter
评分
在filter
查询下面的查询对计算分数没有影响-可以认为返回0分。分数只受指定查询的影响,例如:
GET /_search
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
由于未指定评分查询,第一个查询将所有文档得分设置为0
GET /_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}
上面的bool
查询具有match_all
子句,改查询会为所有文档分配1.0的分数
GET /_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
constant_score
查询和上面的match_all
表现一致,为该过滤器匹配的所有文档分配1.0的分数
Boosting query
返回匹配positive
的文档,同时降低匹配negative
的文档的相关性分数
你可以使用提升查询来降级某些文档,而不必将它们从搜索结果中排除
案例
GET /_search
{
"query": {
"boosting" : {
"positive" : {
"term" : {
"text" : "apple"
}
},
"negative" : {
"term" : {
"text" : "pie tart fruit crumble tree"
}
},
"negative_boost" : 0.5
}
}
}
参数 | 描述 |
---|---|
positive | 必需的查询对象)要运行的查询,返回的所有文档都必须与此查询匹配 |
negative | (必需的查询对象)查询用于降低匹配文档的相关性得分,如果返回的文档与肯定查询和该查询匹配,则增强查询将计算文档的最终相关性得分,按照以下步骤:1.从positive 查询中获取原始的相关性分数 2.将分数乘以negative_boost 值 |
negative_boost | (必需,浮点数)0到1.0之间的浮点数,用于降低与否定查询匹配的文档的相关性得分 |
Constant score query
包装一个filter query
,返回相关性分数等于boost
的文档
GET /_search
{
"query": {
"constant_score" : {
"filter" : {
"term" : { "user" : "kimchy"}
},
"boost" : 1.2
}
}
}
参数 | 描述 |
---|---|
filter | (必需的查询对象)过滤要运行的查询,返回的所有文档都必须与此查询匹配。过滤查询不计算相关性分数。 为了提高性能,Elasticsearch自动缓存常用的过滤器查询 |
boost | (可选,float)浮点数,用作与过滤器查询匹配的每个文档的恒定相关性得分。 默认为1.0 |