Elasticsearch单查询多通配符无结果问题求助
Elasticsearch多通配符AND组合查询问题解答
Elasticsearch完全支持通过bool的must子句(即AND逻辑)组合多个wildcard查询,你的查询语法本身是正确的。出现单独查询有结果、组合无结果的情况,大概率是以下原因之一:
可能的问题原因
- 无交集文档:虽然两个wildcard查询各自能命中结果,但没有文档同时满足两个条件
- 大小写不匹配:wildcard查询默认大小写敏感,如果你的数据里字段值是大写(比如
Stewart),而查询用了小写的*ste*,会匹配不到 - 字段映射问题:如果字段是
text类型但使用了特殊分词器,导致wildcard匹配的分词词条和你预期的原始值不符;或是字段为keyword类型但值的格式和查询通配符不匹配
正确的组合查询示例
带大小写不敏感的wildcard组合查询
如果是大小写问题,可在wildcard查询中启用case_insensitive参数:
{ "query": { "bool": { "must": [ { "wildcard": { "firstname": { "value": "*nne*", "case_insensitive": true } } }, { "wildcard": { "lastname": { "value": "*ste*", "case_insensitive": true } } } ] } } }
使用query_string实现AND组合通配符查询
如果想用query_string,需明确指定字段和AND逻辑,同时开启大小写不敏感:
{ "query": { "query_string": { "query": "firstname:*nne* AND lastname:*ste*", "case_insensitive": true } } }
排查建议
- 验证是否存在同时满足两个条件的文档:分别执行两个单独的wildcard查询,对比结果中的文档ID是否有重叠
- 查看字段映射:执行
GET /<你的索引名>/_mapping,确认firstname和lastname的字段类型、分词器设置 - 验证查询逻辑:使用
GET /<你的索引名>/_validate/query?explain=true传入你的查询,查看查询解释是否符合预期
内容的提问来源于stack exchange,提问作者Kingshuk Deb
相关产品推荐
相关产品推荐

