【问题标题】:Elasticsearch java api get average of terms aggregationElasticsearch java api获取术语聚合的平均值
【发布时间】:2019-04-09 19:38:41
【问题描述】:

我将 elasticsearch 与 java api 结合使用,并试图从每个术语聚合桶中获取最低记录的平均值。我找到的一种解决方案是得到这样的结果

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

然后在代码端计算平均值。问题是如果有很多结果,它会分配很多内存来计算它。我想在弹性方面做到这一点。 我发现,有类似 avg bucket pipeline 聚合之类的东西,它可以作为 sibling 聚合添加到术语(和其他)

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

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

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

我正在考虑制作一些空的顶级聚合,然后将所有聚合添加为子聚合,但这似乎很愚蠢,而且我没有正确理解某些东西。 有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    到目前为止我发现的唯一解决方案是将聚合作为“空聚合”的子聚合

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

    【讨论】:

      【解决方案2】:

      我的解决方案是使用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"));
      

      【讨论】:

        猜你喜欢
        • 2017-09-09
        • 2014-07-09
        • 1970-01-01
        • 2021-06-06
        • 2020-09-20
        • 1970-01-01
        • 2021-06-06
        • 2015-11-06
        • 2015-01-21
        相关资源
        最近更新 更多