Elasticsearch агрегат и сумма по полю (по группам) - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующие данные в моем индексе:

{
  "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 голосов
/ 26 апреля 2018

вы создали второе объединение как одноуровневое, и вам нужно просто объединить. + здесь не нужно использовать вложенную агрегацию.

AggregationBuilder aggregationBuilder = AggregationBuilders.global("agg")
    .subAggregation(AggregationBuilders.terms("by_category").field("category")
    .subAggregation(AggregationBuilders.sum("sum_price").field("price")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...