Elasticsearch: 집계(Aggregations) 완벽 정리

Elasticsearch는 단순한 검색 기능뿐만 아니라 데이터 분석 및 통계 처리까지 가능합니다.
Aggregation(집계) 기능을 활용하면 다양한 연산 수행 가능
Kibana와 연동하여 데이터 시각화 가능
Metrics Aggregation & Bucket Aggregation으로 데이터 분석 가능

이번 글에서는 Aggregation 개념, 설정 방법, 주요 기능, 실전 예제까지 상세히 알아보겠습니다.


1. Aggregations 개요

     
개념 Elasticsearch에서 데이터를 그룹화하고 통계 처리하는 기능  
사용 목적 데이터 분석, 로그 처리, 검색 결과 요약, 통계 계산  
주요 유형 Metrics Aggregation (숫자 연산) Bucket Aggregation (데이터 그룹화)  

2. Aggregation 기본 구조

🔹 Aggregation 문법

✔ _search API에서 aggs(aggregations) 옵션을 사용
✔ 여러 개의 Aggregation을 동시에 수행 가능

📌 예제 1: Aggregation 기본 구조

GET my_index/_search
{
  "query": { ... },
  "aggs": {
    "aggregation_name_1": {
      "aggregation_type": {
        "field": "필드명"
      }
    },
    "aggregation_name_2": {
      "aggregation_type": {
        "field": "필드명"
      }
    }
  }
}

여러 개의 Aggregation을 한 번에 실행 가능


3. 데이터 예제 (지하철 승객 수 데이터)

이제 Aggregation을 테스트할 지하철 승객 수 데이터를 입력합니다.

📌 예제 2: my_stations 인덱스 생성 및 데이터 입력

PUT my_stations/_bulk
{"index": {"_id": "1"}}
{"date": "2019-06-01", "line": "1호선", "station": "종각", "passangers": 2314}
{"index": {"_id": "2"}}
{"date": "2019-06-01", "line": "2호선", "station": "강남", "passangers": 5412}
{"index": {"_id": "3"}}
{"date": "2019-07-10", "line": "2호선", "station": "강남", "passangers": 6221}
{"index": {"_id": "4"}}
{"date": "2019-07-15", "line": "2호선", "station": "강남", "passangers": 6478}
{"index": {"_id": "5"}}
{"date": "2019-08-07", "line": "2호선", "station": "강남", "passangers": 5821}
{"index": {"_id": "6"}}
{"date": "2019-08-18", "line": "2호선", "station": "강남", "passangers": 5724}
{"index": {"_id": "7"}}
{"date": "2019-09-02", "line": "2호선", "station": "신촌", "passangers": 3912}
{"index": {"_id": "8"}}
{"date": "2019-09-11", "line": "3호선", "station": "양재", "passangers": 4121}
{"index": {"_id": "9"}}
{"date": "2019-09-20", "line": "3호선", "station": "홍제", "passangers": 1021}
{"index": {"_id": "10"}}
{"date": "2019-10-01", "line": "3호선", "station": "불광", "passangers": 971}

지하철 노선, 역명, 날짜, 승객 수 데이터를 포함한 샘플 데이터 생성


4. Metrics Aggregations (숫자 계산)

숫자 필드(passangers)를 대상으로 평균, 최대, 최소, 합계를 계산

📌 예제 3: 승객 수의 평균, 합계, 최대, 최소값 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "avg_passengers": {
      "avg": {
        "field": "passangers"
      }
    },
    "sum_passengers": {
      "sum": {
        "field": "passangers"
      }
    },
    "max_passengers": {
      "max": {
        "field": "passangers"
      }
    },
    "min_passengers": {
      "min": {
        "field": "passangers"
      }
    }
  }
}

지하철 승객 수의 평균, 합계, 최대, 최소값을 계산


5. Bucket Aggregations (데이터 그룹화)

문자열 필드를 기준으로 그룹화하여 데이터 집계 가능
승객 수를 지하철 노선(line) 또는 역(station)별로 그룹화 가능

📌 예제 4: 지하철 노선(line)별 평균 승객 수 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "group_by_line": {
      "terms": {
        "field": "line.keyword"
      },
      "aggs": {
        "avg_passengers": {
          "avg": {
            "field": "passangers"
          }
        }
      }
    }
  }
}

각 지하철 노선별 평균 승객 수를 구하는 쿼리

📌 예제 5: 날짜(date)별 총 승객 수 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "group_by_date": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_passengers": {
          "sum": {
            "field": "passangers"
          }
        }
      }
    }
  }
}

월별 승객 수를 계산하는 date_histogram을 사용


6. Nested Aggregations (중첩 집계)

하나의 집계 내부에서 또 다른 집계를 수행
예: 지하철 노선별 승객 수 합계를 계산하고, 그 안에서 최대값 구하기

📌 예제 6: 노선별 승객 수 합계 & 최대값 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "group_by_line": {
      "terms": {
        "field": "line.keyword"
      },
      "aggs": {
        "sum_passengers": {
          "sum": {
            "field": "passangers"
          }
        },
        "max_passengers": {
          "max": {
            "field": "passangers"
          }
        }
      }
    }
  }
}

각 노선별로 승객 수 합계 및 최대값을 구하는 중첩 집계(Nested Aggregation)


7. 정리

     
Metrics Aggregations 숫자 필드 연산 avg, sum, max, min
Bucket Aggregations 특정 필드를 기준으로 그룹화 terms, date_histogram
Nested Aggregations 하나의 집계 내부에서 또 다른 집계 수행 terms + sum + max 조합

8. 학습 가이드

1️⃣ Aggregation의 기본 개념을 이해하고 직접 쿼리 실행
2️⃣ terms, avg, sum, date_histogram을 사용하여 데이터 분석 실습
3️⃣ 중첩 Aggregation을 활용하여 고급 데이터 분석 적용


9. 마무리

Elasticsearch의 집계(Aggregations) 기능을 활용하면
검색 결과를 통계적으로 분석 가능
다양한 유형의 데이터 그룹화 및 연산 수행 가능
Kibana와 연동하여 강력한 시각화 기능 제공

다음 학습에서는 Aggregation 성능 최적화 및 고급 활용법을 다루겠습니다! 🚀

+ Recent posts