Как добавить Bucket Sort в Query Aggregation - PullRequest
0 голосов
/ 27 октября 2018

У меня есть ElasticSearch Query, который работает хорошо (curl), это мой первый запрос,

Сначала я фильтрую по организации (Multitenancy), затем группирую по клиенту, Наконец, суммирую объем продаж, но я хочу иметь только 3 лучших клиента.

У меня вопрос: как построить агрегацию с помощью AggregationBuilders, чтобы получить оператор "bucket_sort". Я получил группировку продаж по клиенту с Java API.

Эластичный запрос:

 curl -X POST 'http://localhost:9200/sales/sale/_search?pretty'  -H 'Content-Type: application/json' -d '
     {
         "aggs": {

     "filtered": {
       "filter": {
         "bool": {
           "must": [
             {
               "term": {
                 "organization_id": "15"
               }
             }
           ]
         }
       },
       "aggs": {
               "by_customer": {
                 "terms": {
                   "field": "customer_id"
                 },
                  "aggs": {
                      "sum_total" : {
                          "sum": {
                              "field": "amount"
                          }
                      },
                      "total_total_sort": {
                           "bucket_sort": {
                               "sort": [
                                 {"sum_total": {"order": "desc"}}
                               ],
                               "size": 3
                           }
                       }

                  }
               }
           }
     }
 }
 }'

Мой код Java:

@Test
public void queryBestCustomers() throws UnknownHostException {
    Client client = Query.client();
    AggregationBuilder sum = AggregationBuilders.sum("sum_total").field("amount");
    AggregationBuilder groupBy = AggregationBuilders.terms("by_customer").field("customer_id").subAggregation(sum);
    AggregationBuilder aggregation =
            AggregationBuilders
                    .filters("filtered",
                            new FiltersAggregator.KeyedFilter("must", QueryBuilders.termQuery("organization_id", "15"))).subAggregation(groupBy);

    SearchRequestBuilder requestBuilder = client.prepareSearch("sales")
            .setTypes("sale")
            .addAggregation(aggregation);
    SearchResponse response = requestBuilder.execute().actionGet();
}

1 Ответ

0 голосов
/ 28 октября 2018

Надеюсь, я правильно понял ваш вопрос.Попробуйте добавить «порядок» в группу groupBy:

AggregationBuilder groupBy = AggregationBuilders.terms("by_customer").field("customer_id").subAggregation(sum).order(Terms.Order.aggregation("sum_total", false));

Еще одна вещь, если вы хотите, чтобы топ-3 клиентов были выше, чем ваш .size(3), он должен быть установлен на groupBy agg, а не на сортировку.как это:AggregationBuilder groupBy = AggregationBuilders.terms("by_customer").field("customer_id").subAggregation(sum).order(Terms.Order.aggregation("sum_total", false)).size(3);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...