Elasticsearch 之 query and filter context

1,119 阅读3分钟

1.Elasticsearch Query 的两种类型

Leaf query clauses:Leaf query clauses 在特定字段中查找特定值,例如 match , term 或 range 查询。 这些查询可以供它们自己使用。

Compound query clauses:Compound query clauses 包装其他 Leaf 或 Compound query clauses,并用于以逻辑方式组合多个查询(例如 bool 或 dis_max 查询),或更改其行为(例如 constant_score 查询)。

查询子句的行为会有所不同,具体取决于它们是在 query context 中还是在 filter context 中使用。

2.relevance score

默认情况下,Elasticsearch 按 relevance score 对匹配的搜索结果进行排序,该得分衡量每个文档与查询的匹配程度。

relevance score 是一个正浮点数,在搜索 API 的 _score 元字段中返回。 _score 越高,文档越相关。 虽然每种查询类型可以用不同的方式计算相关性分数,但是分数计算还取决于查询子句是在 query context 中还是在 filter context 中运行。

3.Query context

在 query context 中,查询子句回答 “此文档与该查询子句的匹配程度如何” 的问题。除了确定文档是否匹配外,查询子句还计算 _score 元字段中的相关性得分。

每当将查询子句传递到 query 参数(例如 search API 中的 query 参数)时,query context 即生效。

4.Filter context

在 filter context 中,查询子句回答问题 “此文档是否与此查询子句匹配?” 答案是简单的 “是” 或 “否” ,即不计算分数。 filter context 主要用于过滤结构化数据,例如

此时间戳记是否在2015年到2016年之间?
状态字段设置为“已发布”吗?

常用的 filter 将由 Elasticsearch 自动缓存,以提高性能。

每当将查询子句传递到 filter 参数(例如 bool 查询中的 filter 或 must_not 参数,constant_score 查询中的 filter 参数或 filter 聚合)时,filter context context 即生效。

5.Example of query and filter contexts

以下是在 search API 的 query and filter context 中使用的查询子句的示例。 此查询将匹配满足以下所有条件的文档:

title 字段包含单词 searach 。
content 字段包含单词 elasticsearch 。
status 字段包含精确的单词 published 。
publish_date 字段包含从2015年1月1日开始的日期。

在 kibana 终端执行:

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 参数是指 query context。

2.bool 和两个 match 子句用于 query context ,这意味着它们用于对每个文档的匹配程度进行评分。

3.filter 参数是指 filter context 。 其 term 和 range 子句用于 filter context 。 它们将过滤出不匹配的文档,但不会影响匹配文档的分数。

6.WARNING

在 query context 中为查询计算的分数表示为单精度 floating 数; 它们只有 24 位才能表示有效的精度。 超过有效位数的分数计算将被转换为 floats 而失去精度。

7.TIP

在 query context 中使用查询子句来确定会影响匹配文档得分的条件(即文档匹配程度),所有其他查询子句则在 filter context 中使用。