《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.3.Search通过Kibana(8) https://developer.aliyun.com/article/1231063
Disjunction max query 查询
Disjunction 查询也被理解为分离最大化查询,指的是将任何与任一查询匹配的文档,作为结果返回,但只将最佳匹配的评分,作为查询的评分结果返回。
例如查询商品名称和品牌名称中包含“苹果”的信息,当品牌的评分高于商品名称时,则返回品牌的评分做为总评分(忽略tie_breaker缓冲)。
GET /my_goods/_search { "query": { "dis_max": { "tie_breaker": 0.7, "boost": 1.2, "queries": [ { "term": { "goodsName": { "value": "苹果" } } }, { "term": { "brandName": { "value": "苹果" } } } ] } } }
返回结果(忽略无关字段)
"max_score" : 3.0150018, "hits" : [ { "_index" : "my_goods", "_type" : "_doc", "_id" : "1", "_score" : 3.0150018, "_source" : { "goodsName" : "苹果 51英寸 4K超高清", "brandName" : "苹果" } }, { "_index" : "my_goods", "_type" : "_doc", "_id" : "5", "_score" : 1.3465583, "_source" : { "goodsName" : "苹果UA55R苹果U7苹果520JXXZ 55英寸 5K超高清", "brandName" : "三星苹果" } }, { "_index" : "my_goods", "_type" : "_doc", "_id" : "4", "_score" : 1.2337791, "_source" : { "goodsName" : "山东苹果UA55RU7520JXXZ 苹果54英寸 5K超高清", "brandName" : "山东苹果" } },
分析:
1、ID=1 的记录,由于品牌只包含“苹果” 2 字,Elasticsearch 认为这种匹配度更高,所以此条记录评分排在第一位。
2、ID=5 的记录,由于品牌中和 ID =4 的记录都包含苹果且字数一样,此时就要看 goodsName 包含苹果的词频数量了,ID=5 的品牌中,“苹果”出现了 3 次,而 ID=4 的值出现了 2次,所以评分没有 ID=5 的高,符合我们的预期结果。
3、tie_breaker 字段做什么用呢?它是起到了缓冲的作用(取值范围:0 到 1 之间),Disjunction 查询会将匹配度最高的字段得分,做为整个文档的得分返回,这种情况其他字段就不起作用了,难免有点走极端。此时就需要 tie_breaker 来做缓存,提升其他字段的影响力,最终的结果:brandName 评分+ goodsName 评分 *tie_breaker,作为总评分返回。
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.3.Search通过Kibana(10) https://developer.aliyun.com/article/1231061