Elasticsearch聚合和按字段求和(分组)

时间:2018-04-26 08:28:20

标签: 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

我确实意识到我需要使用嵌套聚合,但我看不清楚。这是我到目前为止的代码:

    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());
    }

1 个答案:

答案 0 :(得分:1)

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

import { Injectable } from '@angular/core';
import {Subject} from 'rxjs/Subject';

@Injectable()
export class CommonSvc{

  public mySub = new Subject<number>();
  public counter: number = 0;

  increaseCounter(){
    this.counter++;
    this.mySub.next(this.counter);
  }

}