Elasticsearch query_string多值查询结果异常问题咨询
这问题其实是没搞懂Elasticsearch query_string的语法解析规则,我来给你拆解每个场景的原因:
核心问题:query_string的语法解析逻辑
当你在query_string中写类似field: value1 value2的语句时,ES并不会将其解析为「field包含value1或value2」,而是解析为**(field:value1) OR (value2)**——这里的value2是不带字段限定的,会搜索所有默认可搜索字段(当fields为空数组时,ES会使用index.query.default_field配置,通常是所有text类型字段)。
逐个案例拆解
案例1:
"businessId : 1848 4335",结果81条
解析后的查询逻辑是:(businessId:1848) OR (4335)
结果由两部分组成:14条businessId=1848的文档(对应案例4的结果),加上所有其他字段包含4335的67条文档,总和为81条。案例2:调换顺序为
"businessId : 4335 1848",结果162条
解析后的查询逻辑是:(businessId:4335) OR (1848)
由于businessId:4335的匹配结果为0(对应案例3),所以总结果变成所有默认字段包含1848的162条文档,这就是顺序调换后结果翻倍的原因。案例3:单独查询
"businessId : 4335",结果0条
很明确:你的索引中没有任何文档的businessId字段值为4335,所以精准匹配结果为0。案例4:单独查询
"businessId : 1848",结果14条
索引中恰好有14条文档的businessId值为1848,符合预期。案例5:指定
fields: ["businessId"],查询"4335 1848",结果14条
指定字段后,整个查询会被限定在businessId字段内,等价于businessId:4335 OR businessId:1848。因为businessId:4335无匹配,所以结果就是businessId:1848的14条,和案例4一致。
正确写法建议
如果要实现「某个字段包含多个值」的查询,一定要用括号明确限定范围,避免ES错误解析:
"query_string" : { "query" : "businessId:(1848 4335)", "fields" : [] }
或者显式指定运算符(默认是OR,如果需要AND逻辑的话):
"query_string" : { "query" : "businessId:1848 AND businessId:4335", "fields" : [] }
内容的提问来源于stack exchange,提问作者saba safavi

