Elasticsearch Java API获取术语聚合的平均值

时间:2018-11-06 11:57:09

标签: elasticsearch elasticsearch-aggregation elasticsearch-java-api

我正在将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*))

我当时正在考虑进行一些空的顶部聚合,然后将所有聚合添加为子聚合,但是这似乎很愚蠢,并且我无法正确理解某些内容。 有什么想法吗?

2 个答案:

答案 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"))