本地英文版地址: ../en/query-filter-context.html
相关性评分 (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
查询中的 filter
或 must_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 上下文中为查询计算的分数是一个单精度浮点数;它们的有效精度只有24位。 超过有效精度的分数值将被转换为失去精度的浮点数。
在 query 上下文中使用查询子句,用于应该参与计算匹配文档得分的条件(即文档匹配的好坏),而所有其他查询子句(不需要计算得分的)应该放在 filter 上下文中。