elasticsearch聚合查询支持分组统计、数值计算与多维分析:一、terms桶聚合按keyword字段分组计数;二、avg等指标聚合计算numeric字段统计值;三、嵌套聚合实现多级分组内指标计算;四、脚本聚合统计空值率;五、date_histogram按时间区间切片分析。

如果您在 Elasticsearch 中需要对索引数据进行分组统计、数值计算或多维分析,则聚合查询(Aggregation)是核心能力。以下是针对常见业务场景的多种聚合实现方式:
一、基础桶聚合:按字段值分组计数
terms 聚合用于对 keyword 类型字段执行离散值分组,类似 SQL 中的 GROUP BY + COUNT(*)。它要求字段启用 doc_values(默认开启),且不能作用于未启用 fielddata 的 text 字段。
1、构造请求体,指定 size: 0 以仅返回聚合结果,避免传输无关文档。
2、在 aggs 下定义聚合名称(如 popular_colors),类型为 terms,field 设置为目标 keyword 字段(如 "color")。
3、发送 GET 请求到 /cars/transactions/_search 端点。
二、指标聚合:计算数值统计值
avg、sum、min、max 等指标聚合作用于 numeric 类型字段,直接输出单个计算结果。它们可独立使用,也可嵌套在桶聚合内部,实现“每组内求平均值”等复合分析。
1、在 aggs 下声明聚合名(如 avg_salary),类型设为 avg,field 指向 integer 或 double 类型字段(如 "salary")。
2、若需同时获取多个统计量,改用 stats 聚合,一次性返回 count、min、max、avg、sum。
3、确保字段映射类型为 numeric,禁止对 text 字段直接使用指标聚合,否则返回空结果或报错。
三、嵌套聚合:多级分组与子统计
桶聚合支持深度嵌套,例如先按部门分组(terms),再在每个部门内计算平均薪资(avg)。这种结构可替代多层 SQL JOIN 和 GROUP BY,但需警惕内存爆炸风险。
1、外层聚合使用 terms,field 为第一级分组字段(如 "department")。
2、在该聚合的 aggs 子节点中,定义第二级聚合(如 dept_avg_salary),类型为 avg,field 为数值字段(如 "salary")。
3、执行时,Elasticsearch 会为每个唯一部门构建一个桶,并在每个桶内独立执行 avg 计算,结果中每个桶包含自己的指标值。
四、空值率统计:通过脚本聚合识别缺失字段
统计某字段为空(null、missing、empty array)的文档占比,需结合 terms 聚合强制归入单桶、value_count 统计总数与非空数,再用 bucket_script 计算比值。
1、定义顶层聚合 all_documents_agg,使用 script 返回固定字符串 'all',使全部匹配文档落入同一桶。
2、在该桶内并行定义 total_count(value_count 对 _id 字段)和 filtered_count(value_count 配合 script 判断 doc['field'].size() == 0)。
3、添加 percentage_agg,类型为 bucket_script,通过 buckets_path 引用前两个聚合结果,script 中执行 params.filteredCount / params.totalCount * 100。
五、日期直方图聚合:按时间区间切片分析
date_histogram 聚合将时间字段按固定间隔(如月、天、小时)切分为连续桶,适用于趋势分析。它依赖字段类型为 date 且格式正确,不支持 text 类型时间字符串。
1、确认字段 mapping 中 type 为 date,format 包含实际存储格式(如 "strict_date_optional_time||epoch_millis")。
2、聚合类型设为 date_histogram,field 指向该 date 字段,interval 设置为 "month" 或 "1d" 等合法值。
3、可选添加 min_doc_count: 0 以保留无数据的时间桶,避免因稀疏数据导致时间轴断裂。










