你提到的这两个 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 实现 |
❌ 不支持 |
图表用途 | 趋势图、时间序列 | 饼图、条形图 |