基于单个嵌套对象值的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
相关产品推荐
相关产品推荐

