查询时权重提升
在 语句优先级(Prioritizing Clauses) 中,我们解释过如何在搜索时使用 boost
参数让一个查询语句比其他语句更重要。例如:
GET /_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": {
"query": "quick brown fox",
"boost": 2 (1)
}
}
},
{
"match": { (2)
"content": "quick brown fox"
}
}
]
}
}
}
<1> title
查询语句的重要性是 content
查询的 2 倍,因为它的权重提升值为 2
。
<2> 没有设置 boost
的查询语句的值为 1
。
查询时的权重提升 是可以用来影响相关度的主要工具,任意类型的查询都能接受 boost
参数。将 boost
设置为 2
,并不代表最终的评分 _score
是原值的两倍;实际的权重值会经过归一化和一些其他内部优化过程。尽管如此,它确实想要表明一个提升值为 2
的句子的重要性是提升值为 1
语句的两倍。
在实际应用中,无法通过简单的公式得出某个特定查询语句的 正确'' 权重提升值,只能通过不断尝试获得。需要记住的是 `boost` 只是影响相关度评分的其中一个因子;它还需要与其他因子相互竞争。在前例中, `title` 字段相对 `content` 字段可能已经有一个
缺省的’’ 权重提升值,这因为在 字段长度归一值 中,标题往往比相关内容要短,所以不要想当然的去盲目提升一些字段的权重。选择权重,检查结果,如此反复。
提升索引权重
当在多个索引中搜索时,可以使用参数 indices_boost
来提升整个索引的权重,在下面例子中,当要为最近索引的文档分配更高权重时,可以这么做:
GET /docs_2014_*/_search (1)
{
"indices_boost": { (2)
"docs_2014_10": 3,
"docs_2014_09": 2
},
"query": {
"match": {
"text": "quick brown fox"
}
}
}
<1> 这个多索引查询涵盖了所有以字符串 docs_2014_
开始的索引。
<2> 其中,索引 docs_2014_10
中的所有文件的权重是 3
,索引 docs_2014_09
中是 2
,其他所有匹配的索引权重为默认值 1
。
t.getBoost()
这些提升值在 Lucene 的 实用评分函数 中可以通过 t.getBoost()
获得。权重提升不会被应用于它在查询表达式中出现的层,而是会被合并下转至每个词中。 t.getBoost()
始终返回当前词的权重或当前分析链上查询的权重。
[TIP]
实际上,要想解读 explain
的输出是相当复杂的,在 explanation
里面完全看不到 boost
值,也完全无法访问上面提到的 t.getBoost()
方法,权重值融合在 queryNorm
中并应用到每个词。尽管说, queryNorm
对于每个词都是相同的,还是会发现一个权重提升过的词的 queryNorm
值要高于一个没有提升过的。