Elasticsearch terms聚合桶按created_by.id降序排序失败求助
解决Elasticsearch Terms聚合桶排序问题
你说的没错,top_hits的sort只负责每个桶内返回的文档排序,完全不影响桶本身的排列顺序。要让terms聚合的buckets按created_by.id降序排列,得直接在terms聚合本身里设置order参数,而不是依赖top_hits的配置。
修改后的查询示例
{ "size": 0, "aggs": { "filtered_data": { "filter": { "bool": { "must": [ {"range": {"published_at": {"gte": "2019-08-01", "lte": "2023-10-30"}}}, {"term": {"status": "published"}} ] } }, "aggs": { "group_by_creator": { "terms": { "field": "created_by.id", // 重点:设置桶按key降序排列 "order": {"_key": "desc"} }, "aggs": { "latest_hit": { "top_hits": { "size": 1, // 这里的sort控制桶内文档的排序,和桶的顺序无关 "sort": [{"created_by.id": "desc"}] } } } } } } } }
关键说明
- terms聚合默认是按
_count(每个桶的文档数量)降序排列,你之前看到key34在前,大概率是因为它的文档数比key52多。 - 把
order设置为{"_key": "desc"},就能让桶直接按created_by.id(也就是聚合的key)降序排列,实现key52在前、key34在后的效果。 - 如果不需要桶内文档排序,
top_hits里的sort可以删掉,不影响桶的顺序。
内容的提问来源于stack exchange,提问作者Lidya
相关产品推荐
相关产品推荐

