含bucket_sort的Composite聚合无法全局排序问题求助
问题:如何对Elasticsearch所有聚合Bucket进行全局排序?
索引Mapping
我有一个存储金融交易数据的索引,其Mapping定义如下:
{"mappings": {"_doc": {"properties": {"amount": {"type": "long"},"currencyCode": {"type": "keyword"},"merchantId": {"type": "keyword"},"merchantName": {"type": "text"},"partnerId": {"type": "keyword"},"transactionDate": {"type": "date"},"userId": {"type": "keyword"}}}}}
原查询语句
我使用的查询语句如下:
GET /transactions/_search {"aggs": {"date_merchant": {"aggs": {"amount": {"sum": {"field": "amount"}},"amount_sort": {"bucket_sort": {"sort": [{"amount": {"order": "desc"}}]}},"top_hit": {"top_hits": {"_source": {"includes": ["merchantName","currencyCode"]},"size": 1}}},"composite": {"size": 1,"sources": [{"date": {"date_histogram": {"calendar_interval": "day","field": "transactionDate"}}},{"merchant": {"terms": {"field": "merchantId"}}}]}}},"query": {"bool": {"filter": [{"term": {"userId": "AAA"}},{"term": {"partnerId": "BBB"}},{"range": {"transactionDate": {"gte": "2022-07-01"}}},{"term": {"currencyCode": "EUR"}}]}},"size": 0}
问题说明
我注意到Composite聚合中设置了"size":1,当我将该值改为3时,返回结果发生了变化。这说明bucket_sort操作并未对全部bucket进行排序,仅对当前返回的bucket生效(如果只返回1个bucket,排序完全不起作用)。请问如何实现对所有bucket的全局排序?
编辑补充
根据Benjamin的回答,我已将查询改为使用普通聚合而非Composite聚合,并调大了merchantId的bucket容量(默认值为10,而date_histogram无容量限制)。修改后的查询采用嵌套聚合结构:
- 第一层:按
transactionDate以天为间隔执行date_histogram聚合 - 第二层:在每个日期分组内,按
merchantId执行terms聚合 - 在每个商户分组内,依次嵌套:
amount求和聚合、bucket_sort排序聚合、top_hits聚合(用于获取商户名称及币种信息)
内容的提问来源于stack exchange,提问作者Fabio B.
相关产品推荐
相关产品推荐

