如何在Elasticsearch中获取name字段值重复的文档?
如何获取Elasticsearch中name字段重复至少2次的文档
要实现这个需求,可通过以下两种方式操作:
方法一:先定位重复name值,再查询对应文档
1. 聚合统计重复的name
执行以下聚合查询,筛选出所有出现次数≥2的name值:
POST /你的索引名/_search { "size": 0, // 仅返回聚合结果,无需普通搜索数据 "aggs": { "重复name统计": { "terms": { "field": "name.keyword", // 若name是text类型,必须用keyword子字段做精确聚合;若本身是keyword类型,直接写"name"即可 "min_doc_count": 2 // 只保留出现次数≥2的name } } } }
返回结果里,aggregations.重复name统计.buckets中的每个key就是重复的name值(比如示例里的John)。
2. 查询对应完整文档
用上一步得到的重复name值,执行查询获取所有匹配的文档:
POST /你的索引名/_search { "query": { "terms": { "name.keyword": ["John"] // 替换为上一步得到的重复name列表 } } }
方法二:一次性通过聚合获取所有重复文档
如果想一次请求拿到结果,可结合top_hits子聚合,直接获取每个重复name对应的文档:
POST /你的索引名/_search { "size": 0, "aggs": { "重复name分组": { "terms": { "field": "name.keyword", "min_doc_count": 2 }, "aggs": { "对应文档": { "top_hits": { "size": 100 // 根据实际需求调整单次返回的文档数量,默认是10 } } } } } }
返回结果中,aggregations.重复name分组.buckets下每个bucket的对应文档.hits.hits就是该重复name对应的所有文档。
注意事项
- 若
name字段是text类型,必须使用其keyword子字段(通常映射时会自动生成)进行聚合和查询,否则会因分词导致聚合结果不准确。 - 若
name字段本身就是keyword类型,将上述示例中的name.keyword替换为name即可。
内容的提问来源于stack exchange,提问作者David Sachakov
相关产品推荐
相关产品推荐

