ES 查询 —— 分离最大化查询 dis_max 和使用 tie_breaker 参数优化
1、dis_max 查询dis_max,只是取分数最高的那个query的分数而已,完全不考虑其他query的分数。不使用bool查询,可以使用dis_max即分离最大化查询(Disjunction Max Query) 。分离(Disjunction)的意思是 或(or) ,这与可以把结合(conjunction)理解成 与(and) 相对应。分离最大化查询(Disjunction Max Que
·
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
}
}
}
更多推荐
已为社区贡献7条内容
所有评论(0)