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

基于单个嵌套对象值的Elasticsearch Histogram聚合实现问询

实现Elasticsearch中基于单个嵌套对象值的Histogram聚合

没问题,我来帮你搞定这个嵌套对象的直方图聚合需求。首先得划个重点:你的trades字段是nested类型,直接对嵌套字段做聚合是拿不到正确结果的——因为嵌套对象是独立存储的,必须先通过nested聚合进入嵌套对象的上下文,才能访问里面的字段。

下面给你两种常见场景的实现示例:

场景1:统计所有交易的时间分布直方图

比如我们要把所有用户的交易按created_at日期按天分组,统计每天的交易数量,对应的DSL如下:

GET /users/_search
{
  "size": 0, // 不需要返回具体文档,只获取聚合结果
  "aggs": {
    "enter_nested_trades": {
      "nested": {
        "path": "trades" // 指定要进入的嵌套字段路径
      },
      "aggs": {
        "trade_date_histogram": {
          "histogram": {
            "field": "trades.created_at",
            "interval": "1d", // 按天聚合,可根据需求改为1h/7d等
            "format": "yyyy-MM-dd", // 格式化日期,让结果更直观
            "min_doc_count": 0 // 可选:显示没有交易的日期区间
          }
        }
      }
    }
  }
}

代码解释:

  • size: 0:避免返回匹配的文档,专注于聚合结果,减少数据传输
  • enter_nested_trades:自定义的嵌套聚合名称,作用是进入trades嵌套对象的上下文
  • trade_date_histogram:直方图聚合的名称,指定聚合字段为trades.created_at,设置间隔为1天,并格式化日期显示

场景2:过滤特定类型的交易后做直方图

如果只想统计type为BUY的交易时间分布,可以在嵌套聚合内部加上filter聚合来筛选:

GET /users/_search
{
  "size": 0,
  "aggs": {
    "enter_nested_trades": {
      "nested": {
        "path": "trades"
      },
      "aggs": {
        "filter_buy_trades": {
          "filter": {
            "term": {
              "trades.type": "BUY"
            }
          },
          "aggs": {
            "buy_trade_date_histogram": {
              "histogram": {
                "field": "trades.created_at",
                "interval": "1d",
                "format": "yyyy-MM-dd"
              }
            }
          }
        }
      }
    }
  }
}

这样就能精准统计指定类型交易的时间分布了。

内容的提问来源于stack exchange,提问作者Marco Pesani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:18:19