我正在开发一个我们用 Go 编写的应用程序,该应用程序需要随着时间的推移提取一些统计数据。我想从我们拥有的监控索引中提取一些数据,并首先按时间分组,然后按监视器在给定时间点可以返回的不同状态进行分组。例如,对于在访问特定 URL 时记录响应代码的东西,我想先按时间片获取聚合,然后汇总计数为 200、400、403 等状态代码。如何使用Elastic 包做到这一点?
1 回答

蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
这里有几件事要知道。首先,我发现通过查看包中的测试代码最容易了解包的工作原理。这就是我找到我需要的两个聚合的方式,NewAutoDateHistogramAggregation并且NewTermsAggregation.
对于嵌套聚合,您可以通过将子聚合链接到第一个聚合来实现。
我们首先创建statusAgg对象(子聚合),然后在我们根据时间设置父聚合时将其链接起来。注意将 传递statusAgg给SubAggregation链接到日期直方图聚合。
然后执行聚合,实际上只有父聚合被传递给搜索上下文,并且返回的结果嵌套了你所期望的。
statusAgg := elastic.NewTermsAggregation().Field("statuscode")
timeAgg := elastic.NewAutoDateHistogramAggregation().
Field("@timestamp").
SubAggregation("status", statusAgg)
result, err := es.Search().
Index(index).
Query(boolQuery).
Aggregation("time", timeAgg).
Size(0).
Pretty(true).
Do(ctx)
- 1 回答
- 0 关注
- 220 浏览
添加回答
举报
0/150
提交
取消