如何在Elasticsearch中使用通配符查询任意字段?
解决方案
你可以通过两种方式实现多字段的通配符查询,结合原有的精确搜索需求,具体如下:
方法一:使用multi_match的wildcard类型(简洁写法)
利用multi_match指定type: wildcard,一次性在多个keyword字段上执行通配符匹配,和原有的精确查询组合:
GET /_search { "query": { "bool": { "must": [ { "multi_match": { "query": "biden","fields": [ "*.keyword"] } }, { "multi_match": { "query": "123456*", "fields": ["email.keyword", "phone.keyword", "name.keyword"], "type": "wildcard" } } ] } } }
方法二:使用bool.should包含多个wildcard查询(灵活写法)
如果需要给不同字段设置不同的通配符规则,或者更明确地控制每个字段的查询逻辑,可以在bool.must里嵌套一个bool.should,将多个wildcard查询放入其中(默认逻辑是任意一个匹配即可,如果需要所有字段都匹配,就把should换成must):
GET /_search { "query": { "bool": { "must": [ { "multi_match": { "query": "biden","fields": [ "*.keyword"] } }, { "bool": { "should": [ { "wildcard": { "email.keyword": "123456*" } }, { "wildcard": { "phone.keyword": "123456*" } }, { "wildcard": { "name.keyword": "123456*" } } ], "minimum_should_match": 1 // 确保至少匹配其中一个字段,可根据需求调整 } } ] } } }
注意事项
- 始终使用
*.keyword字段执行通配符查询,避免对分词后的text字段执行通配符,否则会出现预期外的匹配结果,且性能较差。 - 通配符查询(尤其是以
*或?开头的)会影响查询性能,如果数据量较大,建议提前通过索引设计优化(比如使用前缀索引)。
内容的提问来源于stack exchange,提问作者user22507585
相关产品推荐
相关产品推荐

