查询和过滤上下文

edit

查询和过滤上下文

edit

相关性分数

edit

默认情况下,Elasticsearch 会根据 相关性得分 对匹配的搜索结果进行排序,该得分衡量每个文档与查询的匹配程度。

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

查询上下文

edit

在查询上下文中,查询子句回答了“这个文档与这个查询子句匹配得如何?”的问题。除了决定文档是否匹配外,查询子句还会在_score元数据字段中计算一个相关性得分。

每当查询子句传递给query参数时,查询上下文就会生效,例如搜索API中的query参数。

过滤上下文

edit

在过滤上下文中,查询子句回答的问题是“这个文档是否匹配这个查询子句?” 答案是一个简单的“是”或“否”——不会计算分数。过滤上下文主要用于过滤结构化数据,例如。

  • 这个时间戳是否在2015年到2016年之间?
  • 是否将状态字段设置为"已发布"

常用的过滤器将由Elasticsearch自动缓存,以加快性能。

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

查询和过滤上下文的示例

edit

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

  • 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" }}}
      ]
    }
  }
}

The query 参数表示查询上下文。

The bool 和两个 match 子句用于查询上下文中,这意味着它们用于评估每个文档的匹配程度。

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

在查询上下文中计算的分数表示为单精度浮点数;它们只有24位用于有效数字的精度。超过有效数字精度的分数计算将被转换为浮点数,并会损失精度。

在查询上下文中使用查询子句来影响匹配文档的分数(即文档的匹配程度),并在过滤上下文中使用所有其他查询子句。