Elasticsearch双字段精确匹配查询返回异常结果问题
Elasticsearch 查询结果不符合预期的原因及修复方案
嘿,我来帮你捋清楚这个问题!你当前的查询返回不符合预期,核心原因是用错了bool查询里的子句类型:
问题根源
你使用了should子句,它的逻辑是满足任意一个条件就会被匹配。也就是说,只要文档的connectorSpecific.hostname.keyword是tyco-fire.com,不管hasForms是true还是false,都会被查询出来——这就是你看到hasForms为false记录的原因。
而你的需求是同时满足两个条件,这时候应该用must或者filter子句:
must:要求条件必须满足,并且会参与文档的相关性算分filter:同样要求条件必须满足,但不会参与算分,还会被Elasticsearch缓存,对于精确匹配的场景性能更优
修复后的查询语句
推荐使用filter版本(因为你的两个条件都是精确匹配,不需要算分):
GET index1/_search { "query": { "bool": { "filter": [ { "term": { "connectorSpecific.hostname.keyword": "tyco-fire.com" }}, { "term": { "hasForms": true }} ] } } }
或者用must版本(如果需要相关性算分的话):
GET index1/_search { "query": { "bool": { "must": [ { "term": { "connectorSpecific.hostname.keyword": "tyco-fire.com" }}, { "term": { "hasForms": true }} ] } } }
另外补充一点:对于keyword类型字段和布尔类型字段,用term查询比match更合适,因为match会对文本进行分词,而keyword是精确匹配,term能直接匹配到准确的字段值。
小提示:bool查询各子句作用快速回顾
must:必须满足,影响算分filter:必须满足,不影响算分,可缓存should:满足任意一个即可(若存在must/filter,默认可选;可通过minimum_should_match强制满足数量)must_not:必须不满足,不影响算分
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

