如何编写Elasticsearch精确匹配字符串查询?解决Kibana过滤问题
解决Kibana中container_name字段精确匹配"armenian"的问题
你当前的match_phrase查询之所以会匹配到所有带armenian前缀的容器,是因为container_name字段大概率是text类型,Elasticsearch会对这类字段做分词处理——比如"armenian_alpha"会被拆成"armenian"和"alpha"两个词,match_phrase只要文档里包含"armenian"这个词就会命中,自然过滤不掉那些变体。
要实现精确匹配,有这几种可行的方式:
1. 使用term查询匹配keyword子字段
Elasticsearch默认会给text类型字段自动生成一个同名的.keyword子字段(不分词,完整存储原始值),直接用这个字段做精确匹配即可,修改后的查询如下:
{ "query": { "term": { "container_name.keyword": "armenian" } } }
2. 在Kibana可视化界面直接设置精确匹配
不用手动写DSL的话,在Kibana添加过滤条件时:
- 选择
container_name字段后,不要选"包含"或"短语"匹配 - 直接选择**"is exactly"(完全等于)**选项,输入"armenian"即可
Kibana会自动帮你生成对应的term查询,匹配.keyword子字段。
3. 确认字段类型(如果是keyword类型直接用term)
如果你的container_name字段本身就是keyword类型(没有被分词),那直接用term查询原字段就行:
{ "query": { "term": { "container_name": "armenian" } } }
内容的提问来源于stack exchange,提问作者user1379280
相关产品推荐
相关产品推荐

