你提到的這兩個 Elasticsearch aggs
聚合語句:
第一種:histogram
直方圖聚合
"aggs": {"DayDiagram": {"histogram": {"field": "${FiledName}","interval": ${TimeInterval},"extended_bounds": {"min": ${StartTime},"max": ${EndTime}}}}
}
第二種:terms
分組聚合
"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 分鐘統計一次事件數(時間直方圖)
"aggs": {"DayDiagram": {"histogram": {"field": "EventTimeMillis","interval": 300000,"extended_bounds": {"min": 1622505600000,"max": 1622592000000}}}
}
假設 EventTimeMillis
是 long
類型,單位是毫秒,表示事件時間。
每 5 分鐘(300000ms)統計一次數據,支持時間缺口補全。
非常適合畫:流量趨勢圖、柱狀圖、折線圖
terms
示例:按車牌顏色統計通過數量(字段聚合)
"aggs": {"Records": {"terms": {"field": "PlateColor.keyword","size": 10}}
}
返回文檔中最常出現的 10 種車牌顏色。
terms
是最常用的聚合類型,等價于 SQL 的 GROUP BY
。
非常適合做:分類統計、占比分析、分組報表
圖示理解(類比 SQL)
histogram:
SELECT floor(EventTimeMillis / 300000) * 300000 AS time_slot, COUNT(*)
FROM table
GROUP BY time_slot;
terms:
SELECT PlateColor, COUNT(*)
FROM table
GROUP BY PlateColor
LIMIT 10;
是否可以嵌套?
可以:
例如你可以在 histogram 桶內再嵌套 terms:
"aggs": {"TimeSlot": {"histogram": {"field": "EventTimeMillis","interval": 300000},"aggs": {"ByPlateColor": {"terms": {"field": "PlateColor.keyword"}}}}
}
效果:每5分鐘 + 按車牌顏色統計,非常適合圖表聯動。
總結對比
項目 | histogram | terms |
---|---|---|
用途 | 時間/數值分桶 | 分類字段分桶 |
數據維度 | 連續區間(固定間隔) | 離散值(不同字段值) |
桶排序 | 默認按 key 升序 | 默認按 count 降序,可改按 key 排序 |
補全空值 | ? 使用 extended_bounds 實現 | ? 不支持 |
圖表用途 | 趨勢圖、時間序列 | 餅圖、條形圖 |