我正在将Elasticsearch与Java api结合使用,并且尝试从每个术语聚合桶中获取最低记录的平均值。我发现的一种解决方案是获得这样的结果
AggregationBuilders.terms("group_by_flights").field("flight_id)
.subAggregation(AggregationBuilders.min("minimum").field("duration")))
,然后在代码端计算平均值。问题是,如果会有很多结果,它将分配大量内存来对其进行计数。我想在弹性方面做到这一点。 我发现,有一些类似“平均存储桶管道聚合”的方法,可以将其作为同级聚合添加到术语(和其他术语)
"the average": {
"avg_bucket": {
"buckets_path": "some_bucket_path"
}
}
问题在于,在Java api中,您只能将管道聚合添加为 subaggregation 。因此,如果我们这样构建聚合,就不会看到我们的术语聚合
AggregationBuilders.terms("group_by_flights").field("flight_id")
.subAggregation(PipelineAggregatorBuilders.avgBucket("avg", "group_by_flights.duration" *<- this wont't be seen because its subaggregation*))
我当时正在考虑进行一些空的顶部聚合,然后将所有聚合添加为子聚合,但是这似乎很愚蠢,并且我无法正确理解某些内容。 有什么想法吗?
答案 0 :(得分:1)
我的解决方案是使用FilterAggregationBuilder
来执行此操作,此操作可以过滤数据。第一个子聚合用于创建数据存储桶,第二个子聚合用于合并存储桶数据。
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"));
答案 1 :(得分:0)
到目前为止,我发现的唯一解决方案是将聚合作为“空聚合”的子聚合
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"))