如何按doc_count对Elasticsearch的composite聚合桶排序?
解决方案
方案一:改用Terms聚合(无需分页时推荐)
如果不需要对聚合结果进行分页操作,直接使用terms聚合就能轻松实现按doc_count排序,这是最直接的方案:
GET /civile/_search { "size": 0, "query": { "match": { "distretto": "MI" } }, "aggs": { "our_buckets": { "terms": { "field": "codiceoggetto.keyword", "size": 1000, "order": { "_count": "desc" // 按文档数量降序排序,升序替换为"asc" } } } } }
方案二:保留Composite聚合(需分页时的变通方法)
如果必须使用composite聚合(比如数据量极大,需要分页获取所有聚合桶),由于composite本身仅支持基于定义的sources字段排序,无法直接按doc_count全局排序,可通过嵌套bucket_sort聚合对当前页的桶进行排序:
GET /civile/_search { "size": 0, "query": { "match": { "distretto": "MI" } }, "aggs": { "our_buckets": { "composite": { "size": 1000, "sources": [ { "codiceoggetto": { "terms": { "field": "codiceoggetto.keyword" } } } ] }, "aggs": { "sort_by_count": { "bucket_sort": { "sort": [ { "doc_count": { "order": "desc" } } ] } } } } } }
注意:这种方式仅对当前返回的1000个桶排序,并非对所有符合条件的桶全局排序后分页,全局排序优先推荐方案一(数据量在
size范围内时)。
内容的提问来源于stack exchange,提问作者zabitstack
相关产品推荐
相关产品推荐

