Elasticsearchjavaapi获取术语聚合的平均值



我在javaapi中使用弹性搜索,并试图从术语聚合的每个桶中获得最低记录的平均值。我发现的一个解决方案是得到这样的结果

AggregationBuilders.terms("group_by_flights").field("flight_id)
.subAggregation(AggregationBuilders.min("minimum").field("duration")))

然后在代码侧计算平均值。问题是,如果有很多结果,它会分配很多内存来计数。我想在弹性方面这样做。我发现,有一种类似avg桶管道聚合的东西,可以作为兄弟聚合添加到术语(和其他(中

"the average": {
"avg_bucket": {
"buckets_path": "some_bucket_path" 
}
}

问题是,在javaapi中,您只能将管道聚合添加为子聚合。因此,如果我们像这样构建聚合,我们的术语聚合将不会被看到

AggregationBuilders.terms("group_by_flights").field("flight_id")
.subAggregation(PipelineAggregatorBuilders.avgBucket("avg", "group_by_flights.duration" *<- this wont't be seen because its subaggregation*))

我想做一些空的顶部聚合,然后将所有聚合添加为子聚合,但这似乎很愚蠢,我没有正确理解一些事情。有什么想法吗?

到目前为止,我找到的唯一解决方案是将聚合作为"空聚合"的子聚合

AggregationBuilders.global("global_aggregation")
.subAggregation((AggregationBuilders.terms("group_by_flights").field("flight_id"))
.subAggregation(AggregationBuilders.min("min").field("duration")))
.subAggregation(PipelineAggregatorBuilders.avgBucket("avg_bucket_aggs","group_by_flights>min"))

我的解决方案是用FilterAggregationBuilder来做,这个可以过滤数据。第一个子聚合生成数据bucket,第二个子聚合合并bucket数据。

AggregationBuilders.filter("global_aggregation", bool)
.subAggregation((AggregationBuilders.terms("group_by_flights").field("flight_id"))
.subAggregation(AggregationBuilders.min("min").field("duration")))
.subAggregation(PipelineAggregatorBuilders.avgBucket("avg_bucket_aggs", "group_by_flights>min"));

最新更新