原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-dis-max-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-dis-max-query.html

dis_max (disjunction max) 查询

译者注:
disjunction max, 通俗解释为: 多个之间取或的最大值。
将任何域任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回。

返回匹配一个或多个被包裹的查询(称为查询子句或子句)的文档。

如果一个返回的文档匹配多个查询子句,dis_max 查询将为该文档分配任何匹配子句中的最高相关性评分,并为任何其他匹配子查询分配一个打破平局的增量。

可以使用 dis_max 在映射了不同 boost 因子的字段中搜索一个 词项(term)。

请求示例

GET /_search
{
    "query": {
        "dis_max" : {
            "queries" : [
                { "term" : { "title" : "Quick pets" }},
                { "term" : { "body" : "Quick pets" }}
            ],
            "tie_breaker" : 0.7
        }
    }
}

dis_max 的顶级参数

queries
(必需的, query 对象数组) 包含一个或多个查询字句。 返回的文档 必须匹配这些查询中的一个或多个。 如果一个文档与多个查询匹配,Elasticsearch 会采用最高的那个 相关性评分
tie_breaker

(可选, float) 01.0 之间的浮点数,用于增加匹配多个查询子句的文档的 相关性评分。 默认值为 0.0

可以使用 tie_breaker 值为多个字段中包含相同词项(term)的文档指定比仅在这些字段中最好的字段中包含该词项的文档更高的相关性评分,而不会将其与多个字段中两个不同术语的更好情况混淆。(这一句的翻译比较烂...)

如果一个文档匹配多个子句,dis_max 查询将计算该文档的相关性评分,计算方法如下:

  1. 从得分最高的匹配子句中取相关性评分。
  2. 将任何其他匹配子句的分数乘以 tie_breaker 值。
  3. 将最高分与相乘后的分数相加。

如果 tie_breaker 的值大于 0.0,则所有匹配的子句都会计算在内,但分数最高的子句计算最多。