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 버킷팅할 값을 계산하는 데 사용하는 선택적 스크립트. 스크립트는 각 값을 수정하도록 동작하므로 오버헤드를 추가하며 신중하게 사용해야 해요.

더 알아보기 (Learn more)