es学习(三)-QueryDSL

本文基于官方文档学习:
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" }}}
      ]
    }
  }
}
  1. query表示这是一个查询上下文
  2. boolmatch在查询上下文中使用,被用来计算每个文档的匹配度,即相关性分数
  3. filter参数表示这个是过滤上下文,termrange用于过滤上下文中,它们过滤出不匹配的文档,并不影响相关性分数

复合查询

复合查询用来包装其他复合查询或者叶查询,以及组合它们的结果和分数,来改变其行为表现,或者从查询切换到过滤上下文,查询包含以下:

Bolean query

布尔查询由一个或者多个子句组成,每个子句有特定的类型

类型描述
must返回文档必须满足must子句的条件,并且参与计算分数
filter返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值
should返回文档可能满足should子句的条件
must_not返回文档不必满足must_not子句的条件,子句在filter context意味着不计分,并且会缓存。由于分数被忽略,所以所有文档的分数都是0

布尔查询采用more-matches-is-better策略,因此mustshould子句的分数会被加起来,为每个文档提供最终的_score

使用minimum_should_match

你可以使用minimum_should_match参数指定返回的文档必须匹配的应当子句的数量或百分比

如果布尔查询中,包含至少一个should子句,并且没有mustfilter子句,默认值就是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

Disjunction max query