java - Elasticsearch 按字段聚合和求和(group by)

标签 java elasticsearch

我的索引中有下一个数据:

{
  "category": "fruit",
  "name": "apple",
  "price": 2.6,
},
{
  "category": "fruit",
  "name": "orange",
  "price": 1.8,
},
{
  "category": "vegs",
  "name": "tomato",
  "price": 0.95,
}

我想按类别对价格进行求和,得到如下结果:

fruit - 4.4
vegs - 0.95

我确实意识到我需要使用嵌套聚合,但我不知 Prop 体如何使用。这是我到目前为止得到的代码:

    SearchRequest searchRequest = new SearchRequest("products");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    searchSourceBuilder.
            aggregation(AggregationBuilders.
                    nested("category_price", "products").
                    subAggregation(
                            AggregationBuilders
                                    .terms("field").field("category")).
                    subAggregation(
                            AggregationBuilders.avg("avg_price").field("price"))
            );

    searchRequest.source(searchSourceBuilder);

    SearchResponse response = client.search(searchRequest);
    Nested agg = response.getAggregations().get("category_price");

    Terms name = agg.getAggregations().get("field");
    for (Terms.Bucket bucket : name.getBuckets()) {
        ReverseNested resellerToProduct = bucket.getAggregations().get("avg_price");
        System.out.println(resellerToProduct.getDocCount());
        System.out.println(resellerToProduct.getName());
    }

最佳答案

您创建了第二个聚合作为同级聚合,您只需要子聚合。 +你不必在这里使用嵌套聚合。

AggregationBuilder aggregationBuilder = AggregationBuilders.global("agg")
    .subAggregation(AggregationBuilders.terms("by_category").field("category")
    .subAggregation(AggregationBuilders.sum("sum_price").field("price")));

关于java - Elasticsearch 按字段聚合和求和(group by),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50038284/

相关文章:

java - 了解Android的webview addjavascriptinterface

java - 已经有 'controllers' bean方法

elasticsearch - Kibana 中的统计信息面板不会显示字段的总值

c# - 如何检查列表中是否包含 NEST 中的术语?

java - 监控多个 java web 应用程序和服务

java - 当前日期和时间 ("Wall"任何时区的日期和时间

elasticsearch - 除了Elasticsearch中的反向索引(它使搜索如此之快)外,内存中还加载了什么?

elasticsearch - 从fluentd添加elasticsearch中的原始字段

java - Android - 实现 Parcelable 的更简单/更快/更简单的方法?

elasticsearch - kopf elasticsearch插件