如何在Elasticsearch中实现字段去重且同时支持分页查询
你之前的实现逻辑存在本质冲突:ES 中顶层 from/size 参数控制的是原始查询命中文档的返回分页,和聚合统计的去重结果属于两条完全独立的执行逻辑,因此混用不会生效;尝试 partition 无返回结果是因为未正确配置聚合分页的相关参数。
方案一:使用 collapse 字段折叠(优先推荐,ES 5.3+支持)
如果需要返回去重后的完整文档内容,使用字段折叠是性能最高、最易用的方案,天生支持原生分页:
POST myIndex/_search { "from": 2, // 分页起始位置,和普通分页用法完全一致 "size": 5, // 每页返回条数 "query": { // 你的原有查询条件写在此处 }, "collapse": { "field": "你的去重字段名" // 注意:该字段必须为keyword类型,或存在keyword类型的子字段 } }
该方案无需额外处理,返回结果直接是按指定字段去重后的分页数据,性能远高于聚合方案,适合绝大多数业务场景。
方案二:terms 聚合 partition 分页
如果仅需要获取去重后的字段值列表,不需要完整文档内容,可以使用该方案,正确配置如下:
POST myIndex/_search { "size": 0, // 必须设置为0,不需要返回原始命中文档 "query": { // 你的原有查询条件写在此处 }, "aggs": { "myField": { "terms": { "field": "你的去重字段名", "include": { "partition": 0, // 分页页码,第1页为0,第2页为1,依次递增 "num_partitions": 20 // 总页数,根据去重后总条数/每页大小计算得出 }, "size": 5, // 每页返回的去重字段条数 "order": { "_key": "asc" // 按字段值固定排序,保证多页查询结果不重复不遗漏 } } } } }
注意:如果去重后总条数超过10000,需要提前修改集群配置 indices.max_terms_count 调整terms聚合的返回上限。
内容的提问来源于stack exchange,提问作者s.h.moghaddasi
相关产品推荐
相关产品推荐

