如何在Elasticsearch中结合聚合与排序查找重复值并获取最新数据
Elasticsearch 按指定字段去重取最新数据实现方案
问题根因
现有查询不生效的核心原因是top_hits聚合未指定按更新时间排序,默认返回相关性评分最高的文档,而非时间最新的;同时叠加了大量多余的重复聚合逻辑,干扰了结果输出。
修正后的查询语句
{ "size": 0, "query": { "bool": { "must": [ { "match": { "BILLING_TYPE_CD": "Service Bundle" } }, { "match": { "ID": "xxxx" } }, { "exists": { "field": "LI_MILESTONE" } }, { "exists": { "field": "LI_SID" } }, { "query_string": { "default_field": "LI_SID", "query": "*xxxx*" } } ], "must_not": { "bool": { "must": [ { "query_string": { "default_field": "LI_PRODUCT_NAME", "query": "*Network*" } }, { "terms": { "LI_MILESTONE.keyword": [ "Abandoned", "Cancelled" ] } }, { "terms": { "ORDER_STATUS.keyword": [ "Abandoned", "Cancelled", "Drop In Progress" ] } }, { "term": { "STATUS.keyword": "" } } ] } } } }, "aggs": { "group_by_lisid": { "terms": { "field": "LI_SID.keyword", "size": 50000, // 若需要分组整体按最新时间排序,打开下方注释,同时保留aggs中的max_update_time聚合 // "order": { // "max_update_time": "desc" // } }, "aggs": { // 可选:用于分组整体排序 "max_update_time": { "max": { "field": "LAST_UPDATE" } }, "latest_record": { "top_hits": { "size": 1, "sort": [ { "LAST_UPDATE": { "order": "desc" } } ], "_source": { "includes": [ "LAST_UPDATE", "xxxxx", "xxxxx", "xxxxx", "xxx" ] } } } } } } }
关键修改说明
- 移除了冗余的composite复合聚合、重复的terms分组逻辑,直接使用一级terms聚合按
LI_SID.keyword分组,每个聚合桶对应同一个LI_SID的所有文档,天然实现去重 - 给
top_hits聚合内部添加LAST_UPDATE字段倒序排序规则,保证每个分组返回的第一条就是该组下最新的文档 - 原查询根节点的sort规则仅作用于原始查询命中的文档,不影响聚合内部的文档排序,因此之前的配置不会生效
- 若需要对最终的分组结果整体按最新时间排序,可打开terms聚合中order的注释,配合max_update_time聚合即可实现
内容的提问来源于stack exchange,提问作者Aminudin
相关产品推荐
相关产品推荐

