es的查询和过滤context

relevances scores 相关性分数

默认情况下,Elasticsearch 通过 relevance score对查询结果进行排序,relevance score衡量每个文档匹配查询的程度。

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

Query context

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

只要将查询子句传递给查询参数(例如搜索API中的查询参数),查询上下文就会生效。

Filter context

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

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

Elasticsearch会自动缓存经常使用的过滤器,以提高性能。

过滤器上下文在将查询子句传递给过滤器参数时生效,比如bool查询中的Filtermust_not参数、constant_score查询中的Filter参数或过滤器聚合。

Example of query and fileter contexts

下面是在搜索API的查询和筛选上下文中使用查询子句的示例。该查询将匹配满足以下所有条件的文档:

  • title字段包含单词search
  • content字段包含单词elasticsearch
  • status字段包含精确字段 published
  • publisg_date字段包含 从2015年1月起的日期
    GET /_search
    {
    "query": { 
      "bool": { 
        "must": [
          { "match": { "title":   "Search"        }},
          { "match": { "content": "Elasticsearch" }}
        ],
        "filter": [ 
          { "term":  { "status": "published" }},
          { "range": { "publish_date": { "gte": "2015-01-01" }}}
        ]
      }
    }
    }
  1. query参数表示查询上下文

  2. bool和两个match子句用于查询上下文中,这表示它们用于为每个文档的匹配情况打分。

  3. filter参数表示过滤上下文。’term’和’range’子句用于查询上下文中。它们会过滤掉不匹配的文档,但是它们不会影响匹配文档的得分。

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

    提示:在查询上下文中使用查询子句来处理应该影响匹配文档得分的条件(即文档匹配的好坏),并在过滤器上下文中使用所有其他查询子句。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!