如何在Elasticsearch中对文档数>10的terms聚合桶执行二次terms聚合?
当然可以实现!
在Elasticsearch里,你可以通过嵌套聚合+Bucket Selector管道聚合的组合来完成这个需求——先完成第一层terms聚合,在每个聚合桶内执行第二次terms聚合,最后过滤掉文档数不满足条件的桶,只保留符合要求的结果。
下面给你一个具体的DSL示例,假设你要先按category字段做第一层聚合,然后只对文档数>10的分类,再按product_type字段做第二次聚合:
{ "size": 0, // 不需要返回原始文档,只保留聚合结果 "aggs": { "category_terms": { "terms": { "field": "category.keyword", // 确保用可聚合的字段(比如keyword类型) "min_doc_count": 1 // 先保留所有有数据的桶,后续再过滤 }, "aggs": { // 第二层terms聚合:针对当前分类下的文档,按product_type分组 "product_type_terms": { "terms": { "field": "product_type.keyword" } }, // Bucket Selector管道聚合:过滤掉文档数<=10的分类桶 "filter_valid_buckets": { "bucket_selector": { "buckets_path": { "docCount": "_count" // 引用当前桶的文档数 }, "script": "params.docCount > 10" // 筛选条件:文档数大于10 } } } } } }
关键细节说明:
size: 0:避免返回原始文档,大幅提升查询效率,毕竟我们只关心聚合结果。- 第一层
terms聚合的min_doc_count设为1:先获取所有存在的分组,再通过管道聚合筛选,比直接设置min_doc_count:11更灵活——毕竟你需要先完成第二层聚合,再过滤桶。 bucket_selector管道聚合:它会遍历第一层聚合的每个桶,只保留满足docCount >10条件的桶,最终返回的结果里只有符合要求的分类,且每个分类下都包含对应的product_type聚合数据。- 字段选择:确保你用的是可聚合字段,比如
keyword类型的字段;如果是text字段,建议使用其keyword子字段(开启fielddata是备选,但不推荐)。
内容的提问来源于stack exchange,提问作者Itai
相关产品推荐
相关产品推荐

