카테고리 없음

[LV 3] Aggregation (집계) 심화 학습

JABHACK 2025. 2. 2. 14:00

Aggregation (집계) 심화 학습

📌 Elasticsearch의 **Aggregation(집계)**는 데이터를 분석하고 요약하는 강력한 기능입니다.

  • SQL의 GROUP BY, SUM, AVG, COUNT, MIN, MAX 기능과 유사하며,
  • 여러 계층의 집계를 포함하는 **계층적 집계(Hierarchical Aggregation)**를 수행할 수 있습니다.

Aggregation(집계)의 종류

Aggregation 유형 설명
Bucket Aggregation 데이터를 그룹화 (Terms, Histogram, Date Histogram)
Metric Aggregation 숫자 필드의 통계 계산 (Sum, Avg, Min, Max, Cardinality)
Sub Aggregation Aggregation 내부에서 추가적인 집계를 수행
Pipeline Aggregation 기존 집계 결과를 추가 연산 (Moving Avg, Bucket Script)

Bucket Aggregation (데이터 그룹화)

Bucket Aggregation은 데이터를 특정 조건에 따라 그룹화하는 기능입니다.

(1) Terms Aggregation (고유 값별 그룹화)

SQL의 **GROUP BY**와 유사한 기능으로, 특정 필드 값에 따라 그룹화합니다.

GET /products/_search
{
  "size": 0,
  "aggs": {
    "category_count": {
      "terms": {
        "field": "category.keyword"
      }
    }
  }
}

"category" 필드의 각 값별 문서 개수 집계.

🔹 응답 예시

{
  "aggregations": {
    "category_count": {
      "buckets": [
        { "key": "IT", "doc_count": 10 },
        { "key": "Electronics", "doc_count": 5 }
      ]
    }
  }
}

"IT" 카테고리에 10개 문서, "Electronics" 카테고리에 5개 문서 존재.


(2) Histogram Aggregation (숫자 값 범위 그룹화)

숫자 필드를 특정 구간(bin)으로 나누어 그룹화하는 집계 방식입니다.

GET /products/_search
{
  "size": 0,
  "aggs": {
    "price_histogram": {
      "histogram": {
        "field": "price",
        "interval": 10000
      }
    }
  }
}

price 값을 10,000 단위로 그룹화.

🔹 응답 예시

{
  "aggregations": {
    "price_histogram": {
      "buckets": [
        { "key": 0, "doc_count": 3 },
        { "key": 10000, "doc_count": 5 },
        { "key": 20000, "doc_count": 8 }
      ]
    }
  }
}

가격이 09999원: 3개, 1000019999원: 5개, 20000~29999원: 8개 문서 존재.


(3) Date Histogram Aggregation (날짜별 그룹화)

날짜 필드를 특정 기간 단위로 그룹화하는 집계 방식입니다.

GET /products/_search
{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "release_date",
        "calendar_interval": "month"
      }
    }
  }
}

날짜(release_date)를 월별로 그룹화.

🔹 응답 예시

{
  "aggregations": {
    "sales_over_time": {
      "buckets": [
        { "key_as_string": "2023-01-01", "doc_count": 4 },
        { "key_as_string": "2023-02-01", "doc_count": 6 },
        { "key_as_string": "2023-03-01", "doc_count": 10 }
      ]
    }
  }
}

2023년 1월: 4건, 2월: 6건, 3월: 10건의 데이터 존재.


Metric Aggregation (통계 집계)

Metric Aggregation은 숫자 필드의 통계를 계산하는 기능입니다.

(1) Sum, Avg, Min, Max Aggregation

GET /products/_search
{
  "size": 0,
  "aggs": {
    "price_stats": {
      "stats": {
        "field": "price"
      }
    }
  }
}

가격(price) 필드의 최소값, 최대값, 평균값, 합계를 계산.

🔹 응답 예시

{
  "aggregations": {
    "price_stats": {
      "min": 15000,
      "max": 60000,
      "avg": 37500,
      "sum": 150000
    }
  }
}

가격 최소값: 15,000원, 최대값: 60,000원, 평균: 37,500원, 합계: 150,000원.


(2) Cardinality Aggregation (고유 값 개수)

특정 필드에서 중복을 제거한 고유 값 개수를 계산합니다.

GET /products/_search
{
  "size": 0,
  "aggs": {
    "unique_categories": {
      "cardinality": {
        "field": "category.keyword"
      }
    }
  }
}

"category" 필드에서 고유한 개수 계산.

🔹 응답 예시

{
  "aggregations": {
    "unique_categories": {
      "value": 5
    }
  }
}

총 5개의 고유한 카테고리 존재.


Sub Aggregations (하위 집계)

Sub Aggregation은 집계 내부에서 추가적인 집계를 수행하는 방식입니다.

(1) 카테고리별 평균 가격 구하기

GET /products/_search
{
  "size": 0,
  "aggs": {
    "category_group": {
      "terms": { "field": "category.keyword" },
      "aggs": {
        "avg_price": {
          "avg": { "field": "price" }
        }
      }
    }
  }
}

각 카테고리별 평균 가격 계산.


Pipeline Aggregation (추가 연산)

Pipeline Aggregation은 기존 집계 결과를 추가로 계산하는 방식입니다.

(1) Moving Average (이동 평균)

GET /products/_search
{
  "size": 0,
  "aggs": {
    "sales_over_time": {
      "date_histogram": {
        "field": "release_date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sales_avg": {
          "moving_avg": {
            "buckets_path": "doc_count"
          }
        }
      }
    }
  }
}

월별 문서 개수(doc_count)를 기반으로 이동 평균 계산.


Aggregation 정리

Aggregation 유형 설명
Terms Aggregation 필드 값별 문서 개수 계산 (GROUP BY)
Histogram Aggregation 숫자 필드를 일정한 범위로 그룹화
Date Histogram Aggregation 날짜 필드를 일정한 기간으로 그룹화
Sum, Avg, Min, Max Aggregation 합계, 평균, 최소값, 최대값 계산
Cardinality Aggregation 중복 제거 후 고유 개수 계산
Sub Aggregation 하나의 집계 내에서 추가적인 집계 수행
Pipeline Aggregation 기존 집계 결과를 이용한 추가 연산 (이동 평균 등)