跳到正文
Elaine Blog
返回

聚合、桶与分析查询

Elasticsearch 与搜索架构

聚合把匹配文档转换成统计结果:指标聚合计算数值,桶聚合按条件分组,管道聚合再处理其他聚合输出。它适合搜索页分面和近实时分析,不应替代所有离线数仓任务。

Table of contents

Open Table of contents

三类聚合

{
  "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。


分享这篇文章:

上一篇
BM25、搜索相关性与排序调优
下一篇
Spring Boot 搜索服务实战