Elasticsearch 5.3如何查询包含重复属性的文档?
如何在Elasticsearch 5.3中找出包含重复属性的文档
没问题,在Elasticsearch 5.3里完全可以通过脚本查询来实现这个需求,不用写复杂的外部处理逻辑。核心思路是通过脚本遍历目标数组,判断是否存在重复的id+other_id组合,具体操作如下:
1. 核心查询逻辑
我们可以利用Painless脚本(Elasticsearch 5.x默认支持的脚本语言),在查询时动态检查thisProperty数组:
- 遍历数组中的每个元素,将
id和other_id拼接成唯一键 - 用HashSet记录这些键,如果某个键无法被添加到集合中(说明已经存在),就判定该文档包含重复元素
2. 完整查询DSL
将以下查询发送到你的索引(替换your_index为实际索引名):
GET /your_index/_search { "query": { "bool": { "filter": { "script": { "script": { "inline": "def items = doc['thisProperty']; if (items == null || items.size() <= 1) return false; def seen = new HashSet(); for (item in items) { def key = item.id + '|' + item.other_id; if (!seen.add(key)) { return true; } } return false;", "lang": "painless" } } } } } }
3. 必要的配置修改
Elasticsearch 5.3默认禁用了inline脚本,所以你需要修改elasticsearch.yml文件,添加或修改以下配置:
script.inline: true script.stored: true
修改完成后重启Elasticsearch节点,才能让inline脚本生效。
4. 补充说明
- 如果你的文档数量非常大,脚本查询可能会有一定性能开销。如果可以修改数据写入逻辑,建议在文档写入时就新增一个字段(比如
has_duplicate_properties),提前判断并标记是否存在重复元素,这样后续查询会更高效。 - 脚本中的
|是拼接分隔符,只要不与id或other_id中的字符冲突即可,你可以换成其他符号。
内容的提问来源于stack exchange,提问作者arturobelano
相关产品推荐
相关产品推荐

