ES 查询 您所在的位置:网站首页 un和dis的用法 ES 查询

ES 查询

#ES 查询 | 来源: 网络整理| 查看: 265

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 } } }

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有