Elasticsearch核心技术与实战学习笔记 第四章 28单字符串多字段查询:Dis Max Query

一 序

  本文属于Elasticsearch核心技术与实战学习笔记系列。

二 单字符串查询

属于常见的查询,搜索引擎只允许一个输入框查询。

准备数据:

PUT /blogs/_doc/1
{
    "title": "Quick brown rabbits",
    "body":  "Brown rabbits are commonly seen."
}

PUT /blogs/_doc/2
{
    "title": "Keeping pets healthy",
    "body":  "My quick brown fox eats rabbits on a regular basis."
}

为啥排序是这样的结果呢?下面看下算分过程。 

算分过程

  • 查询 should 语句中的两个查询
  • 加和两个查询的评分
  • 乘以匹配语句的总数
  • 除以所有语句的总数

文档1 的标题跟body都包含了Brown,文档2 虽然body包含了bown fox,但是标题中没有,导致算分低,导致两者相加的时候评分低。影响了最终的分数。

"explain": true

看下:

Disjunction Max Query 查询

上列中,title 和 body 相互竞争

  • 不应该将分数简单叠加,而是应该找个单个最佳匹配的字段的评分

Disjunction Max Query

  • 将任何与任一查询匹配的文档作为结果返回。采用字段上最匹配的评分返回

换个场景

POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ]
        }
    }
}

这次的查询条件,qucik pets 再文档里面都没有完全匹配的。看下结果

得分一样的。因为quick pets分别出现在文档中。根据最高算分算,所以算分一样的。

通过 Tie Breaker 参数调整

  1. 获得最佳匹配语句的评分
  2. 将其他匹配语句的评分 与 tie_breaker 相乘
  3. 对以上评分求和并规范化
  • Tie Breanker 是一个介于 0-1 之间的浮点数。0 代表使用最佳匹配 l;1 代表所有语句同等重要。

文档2 评分比文档1高。可以看出文档2的红圈比文档1出现多。

小结:

  默认的bool查询,should影响评分。

如果默认的不符合预期,可以引入Disjunction Max Query 调整评分。

猜你喜欢

转载自blog.csdn.net/bohu83/article/details/106445119