1、dis_max 查询

       dis_max,只是取分数最高的那个 query 的分数而已,完全不考虑其他 query 的分数。

       不使用 bool 查询,可以使用 dis_max 即分离最大化查询(Disjunction Max Query) 。分离(Disjunction)的意思是 或(or) ,这与可以把结合(conjunction)理解成 与(and) 相对应。分离最大化查询(Disjunction Max Query)指的是: 将任何与任一查询匹配的文档作为结果返回,但只将最佳匹配的评分作为查询的评分结果返回 :

{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

得到我们想要的结果为:

{
  "hits": [
     {
        "_id":      "2",
        "_score":   0.21509302,
        "_source": {
           "title": "Keeping pets healthy",
           "body":  "My quick brown fox eats rabbits on a regular basis."
        }
     },
     {
        "_id":      "1",
        "_score":   0.12713557,
        "_source": {
           "title": "Quick brown rabbits",
           "body":  "Brown rabbits are commonly seen."
        }
     }
  ]
}

 

2、tie_breaker 优化 dis_max

       dis_max,只是取分数最高的那个query的分数而已,完全不考虑其他query的分数,这种一刀切的做法,可能导致在有其他query的影响下,score不准确的情况,这时为了使用结果更准确,最好还是要考虑到其他query的影响。

场景:

  • 1、某个帖子,doc1,title中包含java(1),content不包含java beginner任何一个关键词
  • 2、某个帖子,doc2,content中包含beginner(1),title中不包含任何一个关键词
  • 3、某个帖子,doc3,title中包含java(1),content中包含beginner(1)
  • 4、以上3个doc的最高score都是1所有最终出来的排序不一定是想要的结果
  • 5、最终搜索,可能出来的结果是,doc1和doc2排在doc3的前面,而不是我们期望的doc3排在最前面

原因:

  • dis_max只取某一个query最大的分数,完全不考虑其他query的分数

例子

GET /forum/article/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "java beginner" }},
                { "match": { "body":  "java beginner" }}
            ]
        }
    }
}

       使用 tie_breaker 将其他 query 的分数也考虑进去:

  • 除了取最高分以外,还会考虑其他的 query 的分数
  • tie_breaker 将其他 query 的分数,乘以 tie_breaker,然后综合与最高分数的那个 query 的分数,综合在一起进行计算
  • tie_breaker 的值,在 0~1之 间,是个小数
GET /forum/article/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "java beginner" }},
                { "match": { "body":  "java beginner" }}
            ],
            "tie_breaker": 0.3
        }
    }
}

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐