如何在Elasticsearch聚合中避免同一订单当日同一状态重复计数?
问题:Elasticsearch统计每日各状态订单数时去重
订单历史记录文档结构示例:
{ "orderNumber" : "xyz", "state" : "shipping", "day" : "2022-07-20", "timestamp" : "2022-07-20T15:06:44.290Z" }
需求:统计每日各state(可选值:shipping、processing、redo等)对应的订单数量,同一订单当日同一state不重复计数(订单当日可能因重复处理产生多条同状态记录)。
当前使用的聚合语句:
GET order-history/_search { "aggs": { "countDays": { "terms": { "field": "day", "order": { "_key": "desc" }, "size": 20 }, "aggs": { "countStates": { "terms": { "field": "state.keyword", "size": 10 } } } } } , "size": 1 }
问题:该语句会对当日同一订单的同一state重复计数,如何避免?
解决方案
需要在state的分桶聚合下,添加cardinality聚合统计唯一的orderNumber,以此实现同一订单当日同状态只计数一次。修改后的聚合语句如下:
GET order-history/_search { "aggs": { "countDays": { "terms": { "field": "day", "order": { "_key": "desc" }, "size": 20 }, "aggs": { "countStates": { "terms": { "field": "state.keyword", "size": 10 }, "aggs": { "unique_order_count": { "cardinality": { "field": "orderNumber.keyword" } } } } } } }, "size": 1 }
关键说明:
- 最外层
countDays按日期分桶,保留原有的排序和数量限制逻辑。 - 中间层
countStates按订单状态分桶,确保同一日期下的状态分组。 - 新增的
unique_order_count使用cardinality聚合,统计每个「日期-状态」分组下的唯一订单编号数量,自动过滤掉当日同状态的重复订单记录。
内容的提问来源于stack exchange,提问作者benito_h
相关产品推荐
相关产品推荐

