如何在 Go 应用程序内的 Elasticsearch 中执行嵌套聚合?

我正在开发一个我们用 Go 编写的应用程序,该应用程序需要随着时间的推移提取一些统计数据。我想从我们拥有的监控索引中提取一些数据,并首先按时间分组,然后按监视器在给定时间点可以返回的不同状态进行分组。

例如,对于在访问特定 URL 时记录响应代码的东西,我想先按时间片获取聚合,然后汇总计数为 200、400、403 等状态代码。

如何使用Elastic 包做到这一点?


德玛西亚99
浏览 221回答 1
1回答

蝴蝶刀刀

这里有几件事要知道。首先,我发现通过查看包中的测试代码最容易了解包的工作原理。这就是我找到我需要的两个聚合的方式,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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go