es的查询和过滤context
relevances scores 相关性分数
默认情况下,Elasticsearch 通过 relevance score对查询结果进行排序,relevance score衡量每个文档匹配查询的程度。
relevance score是一个正的浮点数,在搜索API的_score
元数据字段中返回。_score越高,说明文档越相关。虽然每种查询类型可以以不同的方式计算相关性得分,但得分计算还取决于查询子句是在查询上下文中运行还是在筛选器上下文中运行。
Query context
在查询上下文中,查询子句回答“该文档与该查询子句的匹配程度如何?”除了决定文档是否匹配外,查询子句还在_score元数据字段中计算一个相关性得分。
只要将查询子句传递给查询参数(例如搜索API中的查询参数),查询上下文就会生效。
Filter context
在筛选器上下文中,查询子句回答“这个文档匹配这个查询子句吗?”答案是简单的“是”或“否”——不计算分数。过滤上下文主要用于过滤结构化数据,例如:
- 这个时间戳是在2015年到2016年之间吗?
- 状态字段是否设置为“已发布”?
Elasticsearch会自动缓存经常使用的过滤器,以提高性能。
过滤器上下文在将查询子句传递给过滤器参数时生效,比如bool查询中的Filter
或must_no
t参数、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" }}} ] } } }
query
参数表示查询上下文bool
和两个match
子句用于查询上下文中,这表示它们用于为每个文档的匹配情况打分。filter
参数表示过滤上下文。’term’和’range’子句用于查询上下文中。它们会过滤掉不匹配的文档,但是它们不会影响匹配文档的得分。警告:在查询上下文中为查询计算的分数用单精度浮点数表示,他们只有24位的有效数的精度。超过有效数精度的分数计算将被转换为浮点数,并且会损失精度。
提示:在查询上下文中使用查询子句来处理应该影响匹配文档得分的条件(即文档匹配的好坏),并在过滤器上下文中使用所有其他查询子句。
本作品采用《CC 协议》,转载必须注明作者和本文链接