英文版地址: https://www.elastic.co/guide/en/elasticsearch/guide/current/_boosting_query_clauses.html
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
查询语句提升权重edit
当然 bool
查询不仅限于组合简单的单个词 match
查询,它可以组合任意其他的查询,以及其他 bool
查询。普遍的用法是通过汇总多个独立查询的分数,从而达到为每个文档微调其相关度评分 _score
的目的。
假设想要查询关于 “full-text search(全文搜索)” 的文档,但我们希望为提及 “Elasticsearch” 或 “Lucene” 的文档给予更高的 权重 ,这里 更高权重 是指如果文档中出现 “Elasticsearch” 或 “Lucene” ,它们会比没有的出现这些词的文档获得更高的相关度评分 _score
,也就是说,它们会出现在结果集的更上面。
一个简单的 bool
查询 允许我们写出如下这种非常复杂的逻辑:
GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": "Elasticsearch" }}, { "match": { "content": "Lucene" }} ] } } }
|
|
如果 |
should
语句匹配得越多表示文档的相关度越高。目前为止还挺好。
但是如果我们想让包含 Lucene
的有更高的权重,并且包含 Elasticsearch
的语句比 Lucene
的权重更高,该如何处理?
我们可以通过指定 boost
来控制任何查询语句的相对的权重, boost
的默认值为 1
,大于 1
会提升一个语句的相对权重。所以下面重写之前的查询:
GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": { "query": "Elasticsearch", "boost": 3 } }}, { "match": { "content": { "query": "Lucene", "boost": 2 } }} ] } } }
boost
参数被用来提升一个语句的相对权重( boost
值大于 1
)或降低相对权重( boost
值处于 0
到 1
之间),但是这种提升或降低并不是线性的,换句话说,如果一个 boost
值为 2
,并不能获得两倍的评分 _score
。
相反,新的评分 _score
会在应用权重提升之后被 归一化 ,每种类型的查询都有自己的归一算法,细节超出了本书的范围,所以不作介绍。简单的说,更高的 boost
值为我们带来更高的评分 _score
。
如果不基于 TF/IDF 要实现自己的评分模型,我们就需要对权重提升的过程能有更多控制,可以使用 function_score
查询操纵一个文档的权重提升方式而跳过归一化这一步骤。
更多的组合查询方式会在下章多字段搜索中介绍,但在此之前,让我们先看另外一个重要的查询特性:文本分析(text analysis)。