类似terms、histogram、date_histogram这类桶聚合都会动态生成多个桶,如果生成的桶特别多,我们如何确定这些桶的排序顺序,如何限制返回桶的数量
ES桶聚合支持两种方式排序:
- 内置排
内置排序参数:
_count - 按文档数排序。对 terms 、 histogram 、 date_histogram 有效
_term - 按词项的字符串值的字母顺序排序。只在 terms 内使用
_key - 按每个桶的键值数值排序, 仅对 histogram 和 date_histogram 有效
GET /cars/_search
{
"size" : 0,
"aggs" : {
"colors" : { // 聚合查询名字,随便取一个
"terms" : { // 聚合类型为: terms
"field" : "color",
"order": { // 设置排序参数
"_count" : "asc" // 根据_count排序,asc升序,desc降序
}
}
}
}
}
- 按度量指标排序
GET /cars/_search
{
"size" : 0,
"aggs" : {
"colors" : { // 聚合查询名字
"terms" : { // 聚合类型: terms,先分桶
"field" : "color", // 分桶字段为color
"order": { // 设置排序参数
"avg_price" : "asc" // 根据avg_price指标聚合结果,升序排序。
}
},
"aggs": { // 嵌套聚合查询,设置桶内聚合指标
"avg_price": { // 聚合查询名字,前面排序引用的就是这个名字
"avg": {"field": "price"} // 计算price字段平均值
}
}
}
}
}
AggregationBuilder agg = AggregationBuilders.dateHistogram("group_by_createTime")
.dateHistogramInterval(DateHistogramInterval.days(1))
.field("createTime")
.order(BucketOrder.key(false))
.format(YYYY_MM_DD_HH_MM_SS)
.timeZone(DateTimeZone.getDefault())
.format("yyyy-MM-dd")
.extendedBounds(getExtendBounds(start, end))
.minDocCount(0)
.subAggregation(AggregationBuilders.terms("group_by_taskCode")
.field("taskCode")
.subAggregation(AggregationBuilders.terms("group_by_status").field("status")));
SearchSourceBuilder sb = new SearchSourceBuilder()
.aggregation(agg)
.size(0);
SearchRequest searchRequest = new SearchRequest(getIndexName());
searchRequest.source(sb);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);