How to Use Composite Aggregation to do BucketSort

How to Use Composite Aggregation to do BucketSort

這篇介紹How to Use Composite Aggregation to do BucketSort。

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

List<CompositeValuesSourceBuilder<?>> sources = new ArrayList<>();
sources.add(new TermsValuesSourceBuilder("employee").field("employee").missingBucket(true)
.order(SortOrder.ASC));

CompositeAggregationBuilder composite = new CompositeAggregationBuilder("my_bucket", sources);
composite.subAggregation(AggregationBuilders.sum("salary").field("salary"));

sourceBuilder.query(queryBuilder);
sourceBuilder.fetchSource(false);
sourceBuilder.aggregation(composite);
sourceBuilder.size(0);

FieldSortBuilder salarySort = new FieldSortBuilder("salary").order(SortOrder.DESC);
List<FieldSortBuilder> sortList = new ArrayList<>();
sortList.add(salarySort);
BucketSortPipelineAggregationBuilder bucketsort = new BucketSortPipelineAggregationBuilder(
"salarySortAggs", sortList).from(0).size(10);
composite.subAggregation(bucketsort);

String[] indices = ElasticSearchUtils.timeRangeToIndexesDay(INDEX_NAME_PREFIX);
SearchResponse searchResponse = ELKManager.search(sourceBuilder, indices);

Example說明

1
2
3
針對INDEX_NAME_PREFIX裡的employee欄位做group by後
將salary欄位做sum計算,取出的bucket再做order by sum(salary)
即可取出這張表薪水前10的員工功能