[Elasticsearch] 집계(Aggregations)

임유진·2025년 7월 21일

클라우드/인프라

목록 보기
9/25
post-thumbnail

1. Aggregations 개요

  • Elasticsearch에서는 _search API의 aggs 또는 aggregations 속성으로 데이터를 집계할 수 있음

  • query와 함께 사용 가능하며, 쿼리 결과 필터 후 집계가 실행됨

  • Metrics 집계: 수치 연산 계산 결과를 생성

  • Bucket 집계: 도큐먼트를 그룹화하여 버킷 생성

  • Sub-aggregation: Bucket 내부에 또 다른 Metrics/Bucket 적용

  • Pipeline 집계: 이전 집계 결과를 입력으로 추가 연산


2. 메트릭 집계 (Metrics Aggregations)

주요 타입

  • avg, sum, min, max: 숫자 필드의 평균, 합계, 최솟값, 최댓값
    • sum : 승객 수 전체 합 계산, value: 41995.0
    GET my_stations/_search
    {
      "size": 0,
      "aggs": {
        "all_passengers": {
          "sum": { "field": "passangers" }
        }
      }
    }
  • stats: 평균/합계/최솟값/최댓값/개수 일괄 계산

    stats : count, min, max, avg, sum 결과 획득

    "aggs": {
      "passenger_stats": { "stats": { "field": "passangers" } }
    }
  • extended_stats: 표준편차, 분산 포함 통계
  • value_count: 필드 존재하는 도큐먼트 개수
  • cardinality: 고유 값 개수 (예: 사용자 수). 숫자 필드에 적합

    cardinality : 고유 노선 수 계산 (value: 3)

    "aggs": {
      "unique_lines": { "cardinality": { "field": "line.keyword" } }
    }
  • percentiles: 백분위수 (50%, 95% 등)
  • percentile_ranks: 특정 값이 몇 % 위치인지

    percentiles, percentile_ranks

    • 기본 백분위: 1%,5%,25%,50%,75%,95%,99%
    • 특정 백분위: percents: [20,60,80]
    • 특정 값 백분위 조회: values: [1000,3000,6000]

3. 버킷 집계 (Bucket Aggregations)

  • 도큐먼트를 조건에 따라 그룹화

주요 집계 종류

  • terms: 고유 값별로 그룹화

    terms : 상위 10개 station별 doc_count 생성

    "aggs": {
      "stations": {
        "terms": { "field": "station.keyword", "size": 10 }
      }
    }
  • range: 수치 필드 범위 구간화

    range : 세 구간(미만 1000 / 1000-4000 / 이상 4000)별 doc_count 분리

    "aggs": {
      "pass_count_ranges": {
        "range": {
          "field": "passangers",
          "ranges": [
            { "to": 1000 },
            { "from": 1000, "to": 4000 },
            { "from": 4000 }
          ]
        }
      }
    }
  • histogram: 고정 간격 수치 버킷

    histogram : 0, 2000, 4000, 6000 단위로 버킷 생성

    "aggs": {
      "pass_histogram": {
        "histogram": {
          "field": "passangers",
          "interval": 2000
        }
      }
    }
  • date_histogram: 시간 필드의 날짜 단위 버킷

    date_histogram : 월별 버킷 생성 (key_as_string, key, doc_count)

    "aggs": {
      "monthly": {
        "date_histogram": {
          "field": "date",
          "interval": "month"
        }
      }
    }
  • filters: 여러 조건을 정의한 다중 필터 버킷
  • composite: 페이징 가능한 복합 버킷 (대량 처리에 유리)

4. 하위 집계 (Sub-aggregations)

: 버킷마다 내부 연산을 추가 적용

bucket 내부 avg : 각 station 버킷별 평균 계산

"aggs": {
  "stations": {
    "terms": { "field": "station.keyword" },
    "aggs": {
      "avg_pass": { "avg": { "field": "passangers" } }
    }
  }
}

네스팅 terms : line별 station 집계

"aggs": {
  "lines": {
    "terms": { "field": "line.keyword" },
    "aggs": {
      "stations_per_line": { "terms": { "field": "station.keyword" } }
    }
  }
}

5. 파이프라인 집계 (Pipeline Aggregations)

: 이전 집계 결과를 입력으로 후처리 수행

주요 집계 종류

  • cumulative_sum: 누적합

    cumulative_sum : 월별 승객 합 + 누적 승객 수 계산

    "aggs": {
      "months": {
        "date_histogram": { "field":"date","interval":"month" },
        "aggs": {
          "sum_psg": { "sum": { "field":"passangers" } },
          "cum_sum": { "cumulative_sum": { "buckets_path":"sum_psg" } }
        }
      }
    }
  • derivative: 증감률

  • moving_avg: 이동평균

  • bucket_script: 스크립트 기반 비율 계산

  • sum_bucket, avg_bucket: 하위 버킷 합계/평균

    sum_bucket : month 버킷 안 sum_psg 합계 계산

    "aggs": {
      "mon": {
        "date_histogram": { "field":"date","interval":"month" },
        "aggs": { "sum_psg": { "sum": { "field":"passangers" } } }
      },
      "total_passengers": {
        "sum_bucket": { "buckets_path": "mon>sum_psg" }
      }
    }
  • normalize: 정규화 (백분율 등)


6. Composite Aggregation (페이징 가능한 복합 키 집계)

  • terms는 상위 몇 개만 보여줌. 전체를 보고 싶을 때는 composite 사용.
  • 페이징 방식 after_key로 이어서 가져오기 가능
"aggs": {
  "by_month_store": {
    "composite": {
      "sources": [
        { "month": { "date_histogram": { "field": "date", "calendar_interval": "month" } } },
        { "store": { "terms": { "field": "store.keyword" } } }
      ]
    }
  }
}

7. 활용 예시 요약

목적조합
카테고리별 평균 계산terms + avg
시간대별 트렌드date_histogram + sum 또는 avg
사용자 수 측정cardinality
특정 항목 비율filters + bucket_script
증가 추이 분석derivative, cumulative_sum
복합 조건 통계composite + sub-aggregations
백분위 이상치 분석percentiles, percentile_ranks

전체 요약

집계 유형설명주요 예제
Metrics수치 값 계산sum, avg, min, max, stats, cardinality, percentiles
Bucket도큐먼트 그룹화range, histogram, date_histogram, terms
Sub-aggBucket 안 재집계bucket → metric 또는 bucket
Pipeline집계 결과 후추가 연산cumulative_sum, sum_bucket, derivative 등

참고

profile
말하는 고구마

0개의 댓글