什么是 Elasticsearch 的 dis_max 查询?它如何影响文档的评分?

Sherwin.Wei Lv8

什么是 Elasticsearch 的 dis_max 查询?它如何影响文档的评分?

回答重点

Elasticsearch 中的 dis_max 查询是一种复合查询,可以用来组合多个查询子句,并返回其中评分最高的子句的结果。这对于在多个字段中寻找匹配非常有用,因为它能确保整体查询结果主要受到最匹配字段的影响,而非各个字段的匹配平均水平。

在实际应用中,dis_max 查询可以帮助我们更准确地匹配文档。例如,如果我们在 “title” 和 “description” 两个字段中搜索特定的关键词,我们希望获得标题(更重要的字段)中匹配的文档,而不是在描述(次要字段)中匹配的文档。这时,dis_max 查询能够提升标题匹配的文档的评分,确保这些文档优先于其它结果。

扩展知识

1)实际应用场景

  • 假设我们有一个电子书数据库,每本书都有 “title”(标题)和 “content”(内容)两个字段。如果我们搜索关键词 “Elasticsearch”,标题匹配的文档可能更有效,而内容匹配的文档相对次要。此时,dis_max 查询可以确保那些标题中包含 “Elasticsearch” 的文档优先返回。

2)**dis_max 的工作机制**:

  • dis_max 查找多个子查询中得分最高的那个,并将其作为最终得分。它还有一个 tie_breaker 参数,用于减少完全依赖于单个查询的情况。tie_breaker 参数是一个介于 0 到 1 之间的浮点数,它决定了其他子查询的得分在总体得分中的比例,通常这个值越小,非最优查询的影响越小。

3)查询语法示例

1
2
3
4
5
6
7
8
9
10
11
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Elasticsearch" }},
{ "match": { "content": "Elasticsearch" }}
],
"tie_breaker": 0.3
}
}
}

在这个例子中,我们指定了两个子查询,分别是对 “title” 和 “content” 字段进行 match 查询。同时设置了 tie_breaker 为 0.3,表示除了最高得分字段,其他子查询字段得分的 30% 将被添加到最终得分中。

4)组合查询的灵活性

  • 另一个好处是 dis_max 具有很高的灵活性,可以与其他查询类型(如 must, should)结合使用。例如,我们可以先用 bool 查询确定文档必须匹配某些条件,然后用 dis_max 查询提升某些字段匹配的优先级。

5)评分计算的细节

  • 在使用 dis_max 时,评分计算公式变得更加复杂。简单地说,每个子查询都会计算出自己的独立评分,dis_max 会选择得分最高的那个并添加 tie_breaker 的部分得分。这个机制有利于优化搜索质量,但程序员需要深入理解评分细节来进行调优。
Comments
On this page
什么是 Elasticsearch 的 dis_max 查询?它如何影响文档的评分?