ES 2.4与ES 6.8中default_operator为AND的query_string查询差异问询
解决方案
这个逻辑差异是Elasticsearch 5.0版本迭代时对query_string查询的默认规则调整导致的:5.0+版本将query_string的group_by参数默认值从terms修改为fields,直接导致了你观察到的查询逻辑变化。
修复方法
在你现有query_string的参数中新增"group_by": "terms"配置即可,修改后的查询语句如下:
GET yields_test/_search { "query": { "query_string": { "fields": [ "security_name", "doc_type" ], "query": "high yield", "default_operator": "AND", "group_by": "terms" } } }
逻辑说明
group_by: fields(ES 6.8默认):先以字段为分组单位,要求单个字段内匹配所有检索词,再对多个字段的匹配结果取并集,因此只有security_name同时包含high和yield的id=5文档被返回。group_by: terms(ES 2.4默认):先以检索词为分组单位,要求每个检索词在任意指定字段中命中,因此id=7文档(security_name命中high、doc_type命中yield)也会被纳入返回结果。
添加配置后ES 6.8会生成和ES 2.4完全一致的Lucene查询语句,返回结果也会保持一致。
内容的提问来源于stack exchange,提问作者logdev
相关产品推荐
相关产品推荐

