Date histogram 집계
Date histogram 집계
date_histogram 집계는 date math를 사용해 문서를 시간 기반 버킷으로 그룹화해요. 시간/일/월 단위로 메트릭을 집계하거나, 트래픽 추세를 차트로 그리거나, 시계열 대시보드를 채우는 데 사용해요.
출처: 문서
본문
올바른 간격 선택 (Choose the right interval)
date_histogram은 두 가지 간격 스타일을 지원해요:
- calendar_interval — 버킷을 일, 월, 연도 같은 달력 경계에 맞춰요. 실제 달력 기간에 초점을 맞출 때 사용해요. 예시 값:
"day","1M","year". - fixed_interval — SI 단위로 측정된 정확한 기간을 사용해요. 버킷은 일광 절약 시간이나 월 길이와 무관하게 항상 같은 길이예요. 예시 값:
"5m","12h","30d".
이전 버전의 interval 필드는 호환성을 위해 유지되지만 더 이상 권장되지 않아요(deprecated). 대신 calendar_interval이나 fixed_interval을 사용하세요.
예제: 월별 버킷 (calendar interval)
달력 월별로 문서 수를 집계해요:
GET opensearch_dashboards_sample_data_logs/_search
{
"size": 0,
"aggs": {
"logs_per_month": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "1M"
}
}
}
}
예제: 균일한 시간별 버킷 (fixed interval)
일광 절약 시간 변경과 무관하게 정확히 1시간의 고정 간격으로 버킷을 검색해요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"by_hour": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "1h"
}
}
}
}
예제: 시간대 사용 (Use a time zone)
기본적으로 버킷 생성은 UTC로 이루어져요. time_zone을 설정해 버킷 경계를 특정 시간대에 맞추세요.
Europe/Dublin을 사용해 일별 버킷을 검색해요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"by_day_ie": {
"date_histogram": {
"field": "timestamp",
"calendar_interval": "day",
"time_zone": "Europe/Dublin"
}
}
}
}
예제: offset으로 버킷 시작 시간 이동 (Shift bucket start times using an offset)
offset 파라미터를 사용해 버킷 경계를 앞뒤로 이동시켜요. 예를 들어 자정자정 대신 06:0006:00에 걸친 "보고일(reporting day)"을 정의할 수 있어요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"by_day_shifted": {
"date_histogram": {
"field": "timestamp",
"calendar_interval": "day",
"offset": "+6h"
}
}
}
}
예제: 빈 버킷 포함 (Include empty buckets)
min_doc_count를 0으로 설정하고 extended_bounds에 범위를 제공하면 전체 시간 창에 걸쳐 빈 버킷을 반환해요.
마지막 24시간 동안 데이터가 없는 시간을 포함해 1시간 고정 간격의 버킷을 검색해요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"last_24h": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "1h",
"min_doc_count": 0,
"extended_bounds": {"min": "now-24h", "max": "now"}
}
}
}
}
예제: 범위를 엄격히 제한 (Strictly limit the range)
hard_bounds는 히스토그램을 지정된 최소/최대 시간 범위로 엄격히 제한해요. 이 범위 밖에는 데이터가 존재하더라도 버킷이 생성되지 않아요.
2025-09-01T00:00:00Z와 2025-09-01T06:00:00Z 사이의 기간에 대해 30분 고정 간격의 버킷을 검색해요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"strict_range": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "30m",
"hard_bounds": {"min": "2025-09-01T00:00:00Z", "max": "2025-09-01T06:00:00Z"}
}
}
}
}
예제: keyed로 버킷 맵 반환 (Return a map of buckets using keyed)
keyed: true를 설정하면 버킷을 형식이 지정된 날짜 문자열로 키가 지정된 객체로 반환해요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"per_month": {
"date_histogram": {
"field": "timestamp",
"calendar_interval": "1M",
"format": "yyyy-MM-dd",
"keyed": true
}
}
}
}
예제 응답:
{
"aggregations": {
"per_month": {
"buckets": {
"2025-01-01": {"key_as_string": "2025-01-01", "key": 1735689600000, "doc_count": 3},
"2025-02-01": {"key_as_string": "2025-02-01", "key": 1738368000000, "doc_count": 2}
}
}
}
}
예제: 누락된 날짜를 고정 값으로 처리 (Treat missing dates as a fixed value)
missing 파라미터를 사용해 값이 없는 문서를 제공된 날짜의 합성 버킷에 할당해요:
GET articles/_search
{
"size": 0,
"aggs": {
"published_per_year": {
"date_histogram": {
"field": "publish_date",
"calendar_interval": "year",
"missing": "2000-01-01"
}
}
}
}
예제: 버킷 정렬 (Sort buckets)
기본적으로 버킷은 _key 기준 오름차순으로 정렬되어 반환돼요. 필요하다면 order 파라미터를 사용해 내림차순으로 변경하세요.
가장 최근 월이 먼저 오도록 버킷을 검색해요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"recent_months": {
"date_histogram": {
"field": "timestamp",
"calendar_interval": "1M",
"order": {"_key": "desc"}
}
}
}
}
버킷 수 기준으로 정렬해요 (내림차순):
GET my-logs/_search
{
"size": 0,
"aggs": {
"busiest_hours": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "1h",
"order": {"_count": "desc"}
}
}
}
}
예제: 스크립트 기반 값 소스 (Scripted value source)
Painless 스크립트를 사용해 date_histogram의 버킷 생성에 쓰이는 날짜 값을 동적으로 생성하거나 수정할 수 있어요. 이는 쿼리 시점에 복잡한 날짜 로직을 처리할 수 있는 유연성을 제공해요. 자세한 내용은 Painless scripting language를 참고하세요.
date_histogram 집계는 date 객체나 문자열과 직접 동작하지 않아요. 각 문서의 타임스탬프를 나타내는 단일 숫자 값이 필요해요. 이 값은 epoch 밀리초, 즉 1970년 1월 1일 00:00:00 UTC 이후 경과한 밀리초 수를 나타내는 long 정수여야 해요. 제공하는 모든 스크립트는 이 타입의 값을 반환해야 해요. 스크립트를 사용한 다음 예제는 "field": "timestamp"를 사용한 이전 예제와 동일하게 동작하면서도 date 필드에 대해 올바른 반환 타입을 생성해요:
GET my-logs/_search
{
"size": 0,
"aggs": {
"by_hour_script": {
"date_histogram": {
"script": {
"lang": "painless",
"source": "return doc['timestamp'].value.toInstant().toEpochMilli();"
},
"fixed_interval": "1h"
}
}
}
}
파라미터 (Parameters)
date_histogram 집계는 다음 파라미터를 지원해요.
| 파라미터 | 필수 | 타입 | 설명 |
|---|---|---|---|
| field | field 또는 script 중 하나 필수 | String | 버킷팅할 날짜/날짜-시간 필드. |
| calendar_interval | calendar_interval, fixed_interval, 또는 기존 interval 중 하나 필수 | String | 달력 인식 간격 (예: "day", "1M", "year"). 단수 달력 단위만 지원돼요. |
| fixed_interval | calendar_interval, fixed_interval, 또는 기존 interval 중 하나 필수 | String | 고정 간격, 예: "5m", "12h", "30d". 월이나 분기 같은 달력 단위에는 사용하지 마세요. |
| time_zone | 선택 | String | 버킷 생성과 형식 지정에 사용되는 시간대. "Europe/Dublin" 같은 시간대나 "-07:00" 같은 UTC 오프셋을 받아요. |
| format | 선택 | String | key_as_string에 사용되는 출력 날짜 형식, 예: "yyyy-MM-dd". 생략하면 매핑 기본값이 적용돼요. |
| offset | 선택 | String | 버킷 경계를 양수 또는 음수 간격만큼 이동시켜요, 예: "+6h", "-30m". time_zone 적용 후 계산돼요. |
| min_doc_count | 선택 | Integer | 버킷을 반환하는 데 필요한 최소 문서 수. 기본값은 1이에요. 빈 버킷을 포함하려면 0으로 설정하세요. |
| extended_bounds | 선택 | Object | 데이터를 넘어 버킷 범위를 확장해요: {"min": "<date>", "max": "<date>"}. 종종 min_doc_count: 0과 함께 사용돼요. |
| hard_bounds | 선택 | Object | 버킷을 범위로 엄격히 제한해요: {"min": "<date>", "max": "<date>"}. 범위 밖의 버킷은 절대 생성되지 않아요. |
| missing | 선택 | Date string | 필드가 없는 문서를 이 날짜 값을 가진 것처럼 처리해요. |
| keyed | 선택 | Boolean | true면 버킷을 형식이 지정된 날짜 문자열로 키가 지정된 객체로 반환해요. |
| order | 선택 | Object | 버킷을 _key 또는 _count 기준 오름차순/내림차순으로 정렬해요. |
| script | field 또는 script 중 하나 필수 | Object | 버킷팅할 값을 계산하는 데 사용하는 선택적 스크립트. 스크립트는 각 값을 수정하도록 동작하므로 오버헤드를 추가하며 신중하게 사용해야 해요. |