内容简介:最近有一个线上的es查询问题,最后确定在使用其中找到相关的查询语句:
最近有一个线上的es查询问题,最后确定在使用 bool query
多条件组合查询时出现 should
子句查询失效,于是查找资料来确定问题所在。
其中 Elasticsearch
: 5.5.0
问题
找到相关的查询语句:
"query": { "bool": { // bool query 查询 "should": [ // should子句 { "match_phrase": { "name": { "query": "星起", "boost": 30, "slop": 5 } } } ], "filter": { // #filter子句 "bool": { "must": [ { "terms": { "round": ["A轮"] } }, ] } } } } 复制代码
问题在于:使用 bool query
组合查询时, should
与 filter
组合查询的结果只匹配了 filter
子句,并不匹配 should
子句,达不到 should
和 filter
取交集的预期。
解决方法
翻了一下官方文档: Bool Query | Elasticsearch Reference [5.5] | Elastic
对 should
的解释:
The clause (query) should appear in the matching document. If the bool
query is in aquery context and has a must
or filter
clause then a document will match the bool
query even if none of the should
queries match. In this case these clauses are only used to influence the score. If the bool
query is afilter context or has neither must
or filter
then at least one of the should
queries must match a document for it to match the bool
query. This behavior may be explicitly controlled by settings theminimum_should_match parameter.
大体的意思就是: should
子句是在匹配文档中使用的,如果 bool
查询是在 query
上下文,并且有 must
或者 filter
子句时不管 should
查询是否匹配,都不影响 must
或者 filter
子句的查询。这些子句只是影响查询的 score
而已。如果 bool
查询是在 filter
上下文 或者 既没有 must
也没有 filter
则应至少一个 should
查询必须匹配 bool
查询。也可以显式设置minimum_should_match这个参数来解决。
从官方文档可以看出,有2种方式可以在 bool query
取各数据的交集:
filter minimum_should_match
解决方案
用上面提到2种方式,我们分别尝试一下是否可以达到预期目标。
方案一
使用 filter
上下文:
"query": { "bool": { "filter": { // filter上下文 "bool": { "should": [ // should子句 { "match_phrase": { "name": { "query": "星起", "boost": 30, "slop": 5 } } } ], "filter": { // filter子句 "bool": { "must": [ { "terms": { "round": ["A轮"] } } ] } } } } } } 复制代码
测试结果如下:
"hits": { "total": 1, "max_score": null, "hits": [ { "_index": "index_name", "_type": "hub/product", "_id": "id", "_score": 0.0, // filter下分值为0.0 "_source": { "round": "A轮", "name": "星起Starup", "created_at": "2015-12-25T22:20:36.210+08:00", "sector_name": "企业服务" }, "highlight": { "name": ["<em>星起</em>Starup"] }, "sort": [] } ] } 复制代码
测试结果满足 should
与 filter
子句交集,需要注意结果的分值为 0.0
, 没有对查询结果匹配程度打分。
方案二
使用 minimum_should_match
,至少匹配一项 should
子句,可以如下设置:
"query": { "bool": { "should": [ // should 子句 { "match_phrase": { "name": { "query": "星起", "boost": 30, "slop": 5 } } } ], "minimum_should_match": 1, // 最少匹配一项should中条件子句 "filter": { // filter子句 "bool": { "must": [ { "terms": { "round": ["A轮"] } }, ] } } } } 复制代码
测试结果如下:
"hits": { "total": 1, "max_score": null, "hits": [ { "_index": "index_name", "_type": "hub/product", "_id": "id", "_score": 757.66394, "_source": { "round": "A轮", "name": "星起Starup", "created_at": "2015-12-25T22:20:36.210+08:00", "sector_name": "企业服务" }, "highlight": { "name": ["<em>星起</em>Starup"] }, "sort": [757.66394] } ] } 复制代码
数据为 should
与 filter
子句的交集,符合预期的结果,并且有相应的匹配程度分值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
模式识别
(希)Sergios Theodoridis、(希)Konstantinos Koutroumbas / 电子工业出版社 / 2010-2 / 75.00元
本书全面阐述了模式识别的基础理论、最新方法以及各种应用。模式识别是信息科学和人工智能的重要组成部分,主要应用领域有图像分析、光学字符识别、信道均衡、语言识别和音频分类等。本书在完美地结合当前的理论与实践的基础上,讨论了贝叶斯分类、贝叶斯网络、线性和非线性分类器设计、上下文相关分类、特征生成、特征选取技术、学习理论的基本概念以及聚类概念与算法。与前一版相比,增加了大数据集和高维数据相关的最新算法,这......一起来看看 《模式识别》 这本书的介绍吧!