十二、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码农社区】,会定时推送各种干货:
![](https://img.haomeiwen.com/i4582242/ca4a357ae859b1aa.jpg)