ElastichSearchelasticsearch玩转大数据

十二、Elasticsearch基于tie_breaker参数优

2017-07-15  本文已影响58人  编程界的小学生

搜索title或content中包含java beginner的帖子

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

有的时候(不一定哪一天你就遇到了),可能在实际场景中出现的一个情况是这样的:

(1)doc1:title中包含java,content不包含java beginner中任何一个单词

(2)doc2:content中包含beginner,title中不包含任何一个关键词

(3)doc3:title中包含java,content中包含beginner

最终搜索可能出来的结果是doc1和doc2排在了doc3的前面。

这是因为dis_max,只是取分数最高的那个query的分数而已。比如说:
doc1:
title匹配到了,分数为:1.1
content没匹配到:0

doc2:
title:0
content:1

doc3:
title:0.9
content:0.8

那么dis_max只取了doc1中的title分数值1.1,doc2中的content分数1,doc3中的title分数0.9。完全不考虑其他query的分数,只取最大。

这很明显不是我们想要的结果。

解决方案:
使用tie_breaker将其他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
        }
    }
}

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg
上一篇下一篇

猜你喜欢

热点阅读