原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-filter-context.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-filter-context.html

query 和 filter 上下文

相关性评分 (relevance scores)

默认情况下,Elasticsearch 根据 相关性评分(relevance score) 对匹配到的搜索结果进行排序,这个分数用来衡量每个文档与查询的匹配程度。

相关性分数是一个正浮点数,在 search API 返回结果的 _score 元字段中。 _score越高,文档的相关性就越强。 虽然每种查询类型都可以不同地计算关联分数,但分数计算也取决于查询子句是在 query 上下文中运行还是在 filter 上下文中运行。

query 的上下文

在 query 上下文中,查询子句回答“此文档与此查询子句的匹配程度如何?”。 除了决定文档是否匹配之外,查询子句还计算文档的相关性得分(在元字段 _score 中显示)。

query 上下文在查询子句传递给 query 参数(例如 search API 中的 query 参数)时生效。

filter 的上下文

在 filter 上下文中,查询子句回答“此文档与此查询子句匹配吗?”。 答案是简单的"是"或"否"--不会计算分数。 filter 上下文主要用于过滤结构化数据,比如:

  • 这个 timestamp 是否落在 2015 - 2016 范围内?
  • status 字段是否设置为"published"?

Elasticearch 会自动缓存经常使用的 filter,以提高性能。

每当查询子句传递给 filter 参数时,过滤器上下文就生效,例如 bool 查询中的 filtermust_not 参数,constant_score 查询中的 filter 参数,或者 filter 聚合。

关于 query 和 filter 上下文的例子

下面是一个在 search API 中的 query 和 filter 上下文中使用的查询子句的示例。 该查询将匹配满足以下所有条件的文档:

  • 字段 title 包含单词 search
  • 字段 content 包含单词 elasticsearch
  • 字段 status 完全匹配 published
  • 字段 publish_date 包含从 2015-1-1 之后(大于)的日期。
GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [ 
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}

query 参数指示查询上下文。

bool 和两个 match 子句用于 query 上下文,这表示它们用于对每个文档的匹配程度进行评分。

filter 参数指示 filter 上下文。 其中 termrange 子句用于 filter 上下文。 它们将过滤掉不匹配的文档,但不会影响匹配文档的得分。

在 query 上下文中为查询计算的分数是一个单精度浮点数;它们的有效精度只有24位。 超过有效精度的分数值将被转换为失去精度的浮点数。

在 query 上下文中使用查询子句,用于应该参与计算匹配文档得分的条件(即文档匹配的好坏),而所有其他查询子句(不需要计算得分的)应该放在 filter 上下文中。