聚合把匹配文档转换成统计结果:指标聚合计算数值,桶聚合按条件分组,管道聚合再处理其他聚合输出。它适合搜索页分面和近实时分析,不应替代所有离线数仓任务。
Table of contents
Open Table of contents
三类聚合
- Metric:
avg、sum、min、max、近似cardinality。 - Bucket:
terms、range、date_histogram,把文档放入桶。 - Pipeline:对已有桶计算移动平均、差值或桶筛选。
{
"size": 0,
"aggs": {
"by_category": {
"terms": { "field": "category", "size": 20 },
"aggs": { "avg_price": { "avg": { "field": "priceCents" } } }
}
}
}
聚合字段通常用启用 doc values 的 keyword、数值或日期。不要在分析后的 text 上开启 fielddata 来临时聚合,它可能把大量词项加载进堆;应使用 keyword 子字段。
分布式 terms 的代价
每个分片先返回本地候选桶,协调节点再归并,所以 terms 的低频尾部可能有误差。提高 shard_size 可改善候选完整性,也增加网络和内存。若要遍历大量唯一组合,使用 composite 聚合分页,不要把 size 调成几十万。
Cardinality 是基数,即不同值数量。高基数字段如用户 ID 会产生大量桶;近似 cardinality 用受控内存换误差,必须在业务报告中说明。
运行实验室聚合测试下载:
mvn -Dtest=SearchArchitectureTest#aggregationBuildsCategoryBuckets test
生产接口限制桶数、嵌套深度、日期范围和超时,并监控搜索线程池、请求熔断器、堆和慢日志。报表若扫描数月数据,应转到异步任务或预聚合索引。
下一步
继续阅读09-07 Spring Boot 搜索服务实战,把查询合同包装成可运行的 Java API。