ElasticSearch 7.0多精确hostname查询及通配符匹配问题
Elasticsearch 7.0 多值精确匹配与通配符查询解决方案
一、多值精确匹配多个完整hostname
你尝试的match查询无效,核心原因是server.hostname.keyword是不分词的keyword类型字段,但match查询会默认对查询字符串分词,把"server1-windows.loc2.uk server1-linux.loc1.uk"拆成两个独立词,而keyword字段存储的是完整字符串,自然无法匹配。
正确做法是使用terms查询,它支持传入值数组,直接匹配keyword字段的完整值:
{ "query": { "terms": { "server.hostname.keyword": [ "server1-windows.loc2.uk", "server1-linux.loc1.uk" ] } } }
也可以用bool查询的should子句组合多个精确匹配(效果与terms一致):
{ "query": { "bool": { "should": [ { "match": { "server.hostname.keyword": "server1-windows.loc2.uk" } }, { "match": { "server.hostname.keyword": "server1-linux.loc1.uk" } } ], "minimum_should_match": 1 } } }
二、通配符匹配任意loc的hostname
你的通配符查询无结果,问题出在两点:
match查询不支持通配符(*、?)语法,这类模糊匹配需要用专门的wildcard查询;- 通配符必须作用在
keyword字段上——text字段会把hostname分词成多个独立词(比如server1、windows、loc2),无法匹配完整的字符串结构。
正确的wildcard查询写法如下,可匹配所有以server1-windows.开头、以.uk结尾的hostname:
{ "query": { "wildcard": { "server.hostname.keyword": "server1-windows.*.uk" } } }
内容的提问来源于stack exchange,提问作者MikeByte
相关产品推荐
相关产品推荐

