你提到的这两个 Elasticsearch aggs 聚合语句:
第一种:histogram 直方图聚合
json
"aggs": {
"DayDiagram": {
"histogram": {
"field": "${FiledName}",
"interval": ${TimeInterval},
"extended_bounds": {
"min": ${StartTime},
"max": ${EndTime}
}
}
}
}
第二种:terms 分组聚合
json
"aggs": {
"Records": {
"terms": {
"field": "${GroupByField}",
"size": ${PageSize}
}
}
}
它们的区别概览
| 特性/维度 | histogram 聚合 |
terms 聚合 |
|---|---|---|
| 聚合类型 | 数值直方图(数值/时间区间) | 分类聚合(类似 SQL GROUP BY) |
| 适用字段类型 | long / integer / date 等数字类型 |
keyword 或 .keyword 可聚合的字段类型 |
| 聚合规则 | 按固定步长分桶(如每5分钟、每100) | 按字段值枚举分桶 |
| 桶的 key 是什么? | 范围起点值(如 0、5、10、15) | 具体字段值(如"蓝色","白色","黄色") |
| 是否可控时间段? | ✅ 可通过 extended_bounds 强制显示所有区间 |
❌ 只能显示实际存在的数据 |
| 典型应用 | 时间趋势图、数值区间图 | 某字段的分布、频次分析 |
| 支持排序 | ✅ 默认按桶 key 排序 | ✅ 默认按 doc_count 排序,可自定义 |
示例解释对比
histogram 示例:每 5 分钟统计一次事件数(时间直方图)
json
"aggs": {
"DayDiagram": {
"histogram": {
"field": "EventTimeMillis",
"interval": 300000,
"extended_bounds": {
"min": 1622505600000,
"max": 1622592000000
}
}
}
}
假设 EventTimeMillis 是 long 类型,单位是毫秒,表示事件时间。
每 5 分钟(300000ms)统计一次数据,支持时间缺口补全。
非常适合画:流量趋势图、柱状图、折线图
terms 示例:按车牌颜色统计通过数量(字段聚合)
json
"aggs": {
"Records": {
"terms": {
"field": "PlateColor.keyword",
"size": 10
}
}
}
返回文档中最常出现的 10 种车牌颜色。
terms 是最常用的聚合类型,等价于 SQL 的 GROUP BY。
非常适合做:分类统计、占比分析、分组报表
图示理解(类比 SQL)
histogram:
sql
SELECT floor(EventTimeMillis / 300000) * 300000 AS time_slot, COUNT(*)
FROM table
GROUP BY time_slot;
terms:
sql
SELECT PlateColor, COUNT(*)
FROM table
GROUP BY PlateColor
LIMIT 10;
是否可以嵌套?
可以:
例如你可以在 histogram 桶内再嵌套 terms:
json
"aggs": {
"TimeSlot": {
"histogram": {
"field": "EventTimeMillis",
"interval": 300000
},
"aggs": {
"ByPlateColor": {
"terms": {
"field": "PlateColor.keyword"
}
}
}
}
}
效果:每5分钟 + 按车牌颜色统计,非常适合图表联动。
总结对比
| 项目 | histogram |
terms |
|---|---|---|
| 用途 | 时间/数值分桶 | 分类字段分桶 |
| 数据维度 | 连续区间(固定间隔) | 离散值(不同字段值) |
| 桶排序 | 默认按 key 升序 | 默认按 count 降序,可改按 key 排序 |
| 补全空值 | ✅ 使用 extended_bounds 实现 |
❌ 不支持 |
| 图表用途 | 趋势图、时间序列 | 饼图、条形图 |