为了账号安全,请及时绑定邮箱和手机立即绑定

如何将桶排序添加到查询聚合

如何将桶排序添加到查询聚合

30秒到达战场 2021-12-10 16:24:23
我有一个运行良好的 ElasticSearch 查询 (curl),是我的第一个查询,首先我按组织(多租户)过滤,然后按客户分组,最后总结销售量,但我只想拥有 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代码:@Testpublic 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();}
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我希望我答对了你的问题。尝试将“订单”添加到您的 groupBy agg:

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


查看完整回答
反对 回复 2021-12-10
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

正如另一个答案所提到的,“订单”确实适用于您的用例。


然而,还有其他用例可能需要使用 bucket_sort。例如,如果有人想要分页浏览聚合存储桶。


由于 bucket_sort 是一个管道聚合,您不能使用 AggregationBuilders 来实例化它。相反,您需要使用 PipelineAggregatorBuilders。


您可以在此处阅读有关存储桶排序/管道聚合的更多信息。


以下代码中的“.from(50)”是如何分页浏览存储桶的示例。如果适用,这会导致存储桶中的项目从项目 50 开始。不包括“from”相当于“.from(0)”


BucketSortPipelineAggregationBuilder paging = PipelineAggregatorBuilders.bucketSort(

                    "paging", List.of(new FieldSortBuilder("sum_total").order(SortOrder.DESC))).from(50).size(10);

AggregationBuilders.terms("by_customer").field("customer_id").subAggregation(sum).subAggregation(paging);



查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 219 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信