如何实现Elasticsearch exists查询的大小写不敏感?
Elasticsearch 大小写不敏感的字段存在性查询解决方案
ES的exists查询是精确匹配字段名的,而ES中的字段名本身是大小写敏感的,所以没有直接的配置项让exists查询支持大小写不敏感匹配。针对你的需求,提供两种可行方案:
方案一:统一字段名大小写(推荐)
如果你的ES索引中所有字段都是小写命名,直接将输入的字段名转为小写后传入exists查询即可。这种方式性能最优,因为依然使用ES原生高效的exists查询。
修改后的代码:
String colFieldExistsJson = jo() .put("query", jo() .put("bool", jo() .put("must", jo() .put("exists", jo() .put("field", colAttribute.toLowerCase()))))).toString();
方案二:使用Script查询(适配字段名大小写不统一场景)
如果索引中的字段名大小写不固定,无法提前统一输入格式,可以通过Painless脚本遍历文档的所有字段,实现忽略大小写的字段存在性检查。
修改后的代码:
String colFieldExistsJson = jo() .put("query", jo() .put("bool", jo() .put("must", jo() .put("script", jo() .put("script", jo() .put("source", "for (field in doc.keySet()) { if (field.toLowerCase() == params.targetField.toLowerCase()) { return true; } } return false;") .put("params", jo() .put("targetField", colAttribute))))))).toString();
注意事项
- Script查询需要遍历每个文档的字段集合,性能远低于原生
exists查询,仅适合数据量较小或无法使用方案一的场景。 - 若使用ES 7.x及以上版本,需确保集群已开启脚本支持(默认是开启的,若有修改需检查
script.allowed_types等配置)。
内容的提问来源于stack exchange,提问作者Shidori
相关产品推荐
相关产品推荐

