You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:45:36