Elasticsearch: Pipeline Aggregations (파이프라인 집계) 완벽 정리 🚀

1. Pipeline Aggregations 개요

Metrics Aggregation의 결과를 다시 연산하는 기능
다른 Aggregation 결과를 입력값으로 사용 가능
데이터의 이동 평균, 미분, 누적 합계, 통계 분석 수행 가능


2. Pipeline Aggregations 주요 기능

설명 사용 예시
min_bucket 버킷 중 최솟값 찾기 월별 최소 승객 수
max_bucket 버킷 중 최댓값 찾기 월별 최대 승객 수
avg_bucket 버킷들의 평균값 주간 평균 방문자 수
sum_bucket 버킷들의 합계 분기별 총 매출
stats_bucket min, max, sum, avg 등 한 번에 계산 다양한 통계 분석
cumulative_sum 누적 합계 계산 매월 누적 방문자 수
moving_avg 이동 평균 계산 3개월 이동 평균 승객 수
derivative 값의 미분 계산 방문자 수 증가율

 

Elasticsearch에서 "버킷(Bucket)"이란?
👉 버킷은 데이터를 특정 기준에 따라 그룹화하는 컨테이너입니다.
👉 **"버킷을 만든다"**는 것은 데이터를 특정 조건에 따라 분류하는 것입니다.
👉 각 버킷에는 해당하는 **도큐먼트 개수(doc_count)**가 자동으로 계산됩니다.


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

먼저 테스트 데이터를 준비합니다.

📌 예제 1: 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. 누적 합계 (Cumulative Sum Aggregation)

월별 승객 수 합계를 누적 계산
buckets_path 옵션을 이용해 다른 집계 결과를 참조

📌 예제 2: cumulative_sum으로 누적 승객 수 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        },
        "accum_sum_psg": {
          "cumulative_sum": {
            "buckets_path": "sum_psg"
          }
        }
      }
    }
  }
}

각 월별 합계를 누적하여 계산하는 예제
buckets_path: "sum_psg" → sum_psg 값을 입력으로 사용


5. 이동 평균 (Moving Average Aggregation)

이전 버킷 값을 참조하여 이동 평균 계산
데이터의 변동성을 부드럽게 표현 가능

📌 예제 3: moving_avg로 3개월 이동 평균 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        },
        "moving_avg_psg": {
          "moving_avg": {
            "buckets_path": "sum_psg",
            "window": 3
          }
        }
      }
    }
  }
}

3개월 이동 평균을 계산하여 트렌드 파악
window: 3 → 3개월 이동 평균


6. 미분 (Derivative Aggregation)

변화율(증가율/감소율) 계산 가능
트래픽 증가율, 매출 성장률 분석에 활용

📌 예제 4: derivative로 승객 수 증가율 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        },
        "growth_rate_psg": {
          "derivative": {
            "buckets_path": "sum_psg"
          }
        }
      }
    }
  }
}

승객 수의 증가율(미분 값) 계산


7. 최대값이 있는 버킷 찾기 (Max Bucket Aggregation)

여러 버킷 중 최대값이 포함된 버킷을 찾음
가장 많은 승객이 있는 월 확인 가능

📌 예제 5: max_bucket으로 최대 승객 수를 기록한 월 찾기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "months": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "sum_psg": {
          "sum": {
            "field": "passangers"
          }
        }
      }
    },
    "max_passangers_month": {
      "max_bucket": {
        "buckets_path": "months>sum_psg"
      }
    }
  }
}

가장 승객 수가 많았던 달을 찾는 예제
buckets_path: "months>sum_psg" → 부모 > 자식 관계로 접근


8. 정리

기능 설명 활용 예시
누적 합계 (cumulative_sum) 이전 값들의 합을 누적 총 방문자 수 분석
이동 평균 (moving_avg) 일정 구간의 평균 계산 3개월 이동 평균
미분 (derivative) 값의 증가율 계산 매출 성장률 분석
최대 버킷 (max_bucket) 최대값을 포함한 버킷 찾기 최대 방문자 수가 있는 날짜 찾기

9. 마무리

Pipeline Aggregations을 활용하면 복잡한 데이터 분석 가능
버킷을 기준으로 누적 합, 이동 평균, 증가율 등을 손쉽게 계산 가능
하지만 너무 깊은 Aggregations을 사용하면 성능 저하 가능

이제 Aggregations을 활용하여 더욱 강력한 데이터 분석을 진행할 수 있습니다! 🚀

Elasticsearch: Sub-Aggregations (하위 집계) 완벽 정리

Sub-Aggregations(하위 집계)는 버킷 집계(Bucket Aggregation) 안에서 또 다른 집계를 수행할 수 있도록 지원하는 기능입니다.
한 번의 쿼리로 그룹화된 데이터에 추가적인 분석을 수행 가능
Bucket Aggregation 안에 다시 Bucket 또는 Metrics Aggregation을 중첩하여 사용 가능
여러 계층의 집계를 수행할 수 있어 복잡한 데이터 분석에 적합

이번 글에서는 Sub-Aggregations의 개념, 주요 기능, 실전 예제까지 상세히 알아보겠습니다.


1. Sub-Aggregations 개요

     
개념 Bucket Aggregation 내에서 추가 집계 수행  
사용 목적 그룹화된 데이터 내에서 추가적인 통계 분석 수행  
주요 유형 버킷 안에 Metrics Aggregation 적용 버킷 안에 또 다른 버킷 생성  

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

Sub-Aggregations을 테스트할 데이터를 준비합니다.

📌 예제 1: 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}

지하철 승객 수 데이터를 포함한 샘플 데이터 생성


3. Bucket 내부에서 Metrics Aggregation 수행

버킷 그룹별로 추가적인 통계(평균, 최대, 최소 등)를 계산 가능
terms(역 이름) 기준으로 그룹화 후, 각 역의 평균 승객 수 계산

📌 예제 2: station.keyword 기준으로 그룹화 후 평균 승객 수 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "stations": {
      "terms": {
        "field": "station.keyword"
      },
      "aggs": {
        "avg_psg_per_st": {
          "avg": {
            "field": "passangers"
          }
        }
      }
    }
  }
}

각 역별 평균 승객 수(avg_psg_per_st) 계산 가능


4. Bucket 내부에서 또 다른 Bucket Aggregation 수행

하나의 Bucket 내에서 또 다른 기준으로 데이터를 그룹화 가능
지하철 노선(line.keyword) → 해당 노선의 역(station.keyword) 순으로 그룹화

📌 예제 3: 노선별(line.keyword)로 그룹화 후, 각 노선의 역(station.keyword) 그룹화

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "lines": {
      "terms": {
        "field": "line.keyword"
      },
      "aggs": {
        "stations_per_lines": {
          "terms": {
            "field": "station.keyword"
          }
        }
      }
    }
  }
}

노선별 → 해당 노선의 역을 그룹화하는 예제


5. Bucket 내부에서 Bucket + Metrics Aggregation 수행

버킷 안에 또 다른 버킷을 만들고, 그 내부에서 통계 연산 수행 가능
지하철 노선(line.keyword) → 역(station.keyword) → 평균 승객 수(avg_passangers) 순으로 계산

📌 예제 4: 노선별 → 역별 → 평균 승객 수 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "lines": {
      "terms": {
        "field": "line.keyword"
      },
      "aggs": {
        "stations_per_lines": {
          "terms": {
            "field": "station.keyword"
          },
          "aggs": {
            "avg_passangers": {
              "avg": {
                "field": "passangers"
              }
            }
          }
        }
      }
    }
  }
}

노선별 그룹화 후, 각 역별 평균 승객 수까지 계산하는 예제


6. Sub-Aggregations 주의사항

     
하위 버킷이 많아지면 성능 저하 발생 너무 깊은 버킷 구조는 피할 것  
최대 2~3단계의 Sub-Aggregations을 권장 Elasticsearch 메모리 사용량 증가 가능  
데이터 양이 많다면 size 제한을 걸어야 함 기본 size 값은 10개  

7. 정리

     
버킷 내부에서 통계 연산 terms + avg 그룹화된 데이터 내에서 평균/최대/최소 등 계산
버킷 내부에서 또 다른 그룹화 terms + terms 하나의 그룹화된 데이터 내에서 추가 그룹화
버킷 + 하위 버킷 + 통계 연산 terms + terms + avg 2단계 이상의 그룹화 후 통계 연산 수행

8. 마무리

Sub-Aggregations을 활용하면 데이터를 더욱 정교하게 분석 가능
Bucket 내부에서 또 다른 Bucket 및 Metrics Aggregation 수행 가능
단, 너무 깊은 계층의 Sub-Aggregations은 성능 저하를 유발할 수 있음

다음 학습에서는 고급 Aggregations 기법 및 성능 최적화 방법을 다루겠습니다! 🚀

Elasticsearch: Bucket Aggregations (버킷 집계) 완벽 정리

Bucket Aggregations은 특정 기준으로 데이터를 그룹화하여 분석하는 강력한 기능을 제공합니다.
숫자, 날짜, 문자열 데이터를 기반으로 그룹을 나눌 수 있음
각 그룹(버킷)별로 포함된 문서 수(doc_count)를 계산
각 버킷에 추가적으로 Metrics Aggregation을 적용하여 통계 분석 가능

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


1. Bucket Aggregations 개요

     
개념 데이터를 특정 기준에 따라 그룹화  
사용 목적 데이터 분석 및 요약 정보 제공  
주요 유형 range, histogram, date_range, date_histogram, terms  

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

Bucket Aggregations을 테스트할 데이터를 준비합니다.

📌 예제 1: 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}

지하철 승객 수 데이터를 포함한 샘플 데이터 생성


3. Range Aggregation (범위별 버킷)

숫자 필드 값을 기준으로 특정 범위를 지정하여 그룹화
from(이상), to(미만)으로 범위를 정의

📌 예제 2: 승객 수(passangers)를 기준으로 그룹 나누기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "passangers_range": {
      "range": {
        "field": "passangers",
        "ranges": [
          { "to": 1000 },
          { "from": 1000, "to": 4000 },
          { "from": 4000 }
        ]
      }
    }
  }
}

1000명 미만, 1000~4000명, 4000명 이상으로 그룹화


4. Histogram Aggregation (구간별 버킷)

특정 간격(interval)으로 숫자 필드를 그룹화
range와 달리 interval 값을 설정하여 자동 분할

📌 예제 3: 승객 수를 2000명 단위로 그룹화

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "passangers_his": {
      "histogram": {
        "field": "passangers",
        "interval": 2000
      }
    }
  }
}

2000 단위로 그룹을 생성하여 데이터 분포 확인


5. Date Histogram Aggregation (날짜별 버킷)

날짜 필드를 일정한 기간 간격으로 그룹화
interval 대신 fixed_interval 또는 calendar_interval 사용

📌 예제 4: 한 달 단위로 날짜 필드(date) 그룹화

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "date_his": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      }
    }
  }
}

1개월 단위로 데이터 그룹화하여 시계열 분석 가능


6. Terms Aggregation (카테고리별 버킷)

keyword 필드를 기준으로 데이터를 그룹화
가장 많이 등장하는 값 순으로 정렬됨
데이터 분석 시 특정 필드의 "빈도수"를 파악할 때 유용

📌 예제 5: 지하철 역(station) 기준으로 그룹화

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "stations": {
      "terms": {
        "field": "station.keyword"
      }
    }
  }
}

각 역(station)의 승객 수를 집계하여 가장 많이 등장하는 역을 파악 가능

📌 예제 6: 지하철 노선(line)별 그룹화 및 승객 수 평균 계산

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

노선별 평균 승객 수를 분석하는 예제


7. 정리

     
숫자 범위 range, histogram 특정 범위 또는 간격(interval)으로 그룹화
날짜 범위 date_range, date_histogram 특정 기간 간격으로 그룹화
카테고리별 그룹화 terms keyword 필드 기준으로 그룹화

8. 마무리

Bucket Aggregations을 사용하면 데이터를 원하는 기준으로 그룹화 가능
각 그룹별 개수(doc_count)와 추가 Metrics Aggregations을 조합하여 통계 분석 가능
시계열 데이터 분석, 숫자 범위 분석, 문자열(카테고리) 분석에 매우 유용

다음 학습에서는 고급 Aggregations 및 Nested Aggregations 활용법을 다루겠습니다! 🚀

Elasticsearch: Metrics Aggregations (메트릭 집계) 완벽 정리

Elasticsearch의 Metrics Aggregations을 활용하면 **숫자 필드의 연산(최소, 최대, 평균, 합계, 개수 등)**을 수행할 수 있습니다.
검색된 데이터에서 통계 정보를 추출
로그 분석, 사용자 접속 통계, 매출 분석 등에 활용 가능
백분위(Percentiles) 및 유니크 값(Cardinality) 분석 가능

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


1. Metrics Aggregations 개요

     
개념 숫자 필드를 대상으로 다양한 통계 연산을 수행  
사용 목적 평균, 합계, 최소값, 최대값, 개수 등 통계 값 계산  
주요 유형 min, max, sum, avg, stats, cardinality, percentiles, percentile_ranks  

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

Metrics Aggregations을 테스트할 데이터를 준비합니다.

📌 예제 1: 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}

지하철 승객 수 데이터를 포함한 샘플 데이터 생성


3. 기본 Metrics Aggregations

🔹 1) 최소, 최대, 합계, 평균값 계산

✔ **min, max, sum, avg**를 사용하여 숫자 필드의 통계를 계산 가능

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

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

최소값, 최대값, 합계, 평균을 한 번에 계산 가능

📌 예제 3: 특정 역(강남)의 승객 합계 구하기

GET my_stations/_search
{
  "query": {
    "match": { "station": "강남" }
  },
  "size": 0,
  "aggs": {
    "gangnam_passengers": {
      "sum": { "field": "passangers" }
    }
  }
}

강남역의 전체 승객 수 합계를 구하는 예제


4. stats Aggregation

stats를 사용하면 min, max, sum, avg, count를 한 번에 계산 가능

📌 예제 4: 승객 수의 min, max, sum, avg, count 값 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "passenger_stats": {
      "stats": { "field": "passangers" }
    }
  }
}

한 번의 Aggregation으로 여러 값을 동시에 계산 가능


5. Cardinality Aggregation (고유 값 개수)

특정 필드에 대해 "고유한 값 개수"를 계산
예: line(지하철 노선)이 몇 개 있는지 확인

📌 예제 5: line 필드에서 고유한 노선 개수 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "uniq_lines": {
      "cardinality": { "field": "line.keyword" }
    }
  }
}

1호선, 2호선, 3호선 총 3개의 고유 값이 존재


6. Percentiles Aggregation (백분위 수 계산)

데이터의 특정 백분위 값을 확인 가능 (예: 승객 수의 90% 이상이 몇 명인지 분석)

📌 예제 6: 승객 수의 기본 백분위 계산

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "pass_percentiles": {
      "percentiles": { "field": "passangers" }
    }
  }
}

기본적으로 1%, 5%, 25%, 50%, 75%, 95%, 99% 백분위 값을 제공

📌 예제 7: 특정 백분위 값(20%, 60%, 80%)을 설정

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "pass_percentiles": {
      "percentiles": {
        "field": "passangers",
        "percents": [ 20, 60, 80 ]
      }
    }
  }
}

20%, 60%, 80% 백분위 값을 지정하여 확인 가능


7. Percentile Ranks Aggregation

특정 값이 전체 데이터에서 몇 %에 해당하는지 확인
예: 승객 수 1000명, 3000명, 6000명은 상위 몇 %인지 분석

📌 예제 8: 특정 값의 백분위 랭크 구하기

GET my_stations/_search
{
  "size": 0,
  "aggs": {
    "pass_percentile_ranks": {
      "percentile_ranks": {
        "field": "passangers",
        "values": [ 1000, 3000, 6000 ]
      }
    }
  }
}

각 값이 전체 데이터의 몇 % 수준인지 확인 가능 (예: 1000명은 하위 10% 수준)


8. 정리

     
기본 연산 min, max, sum, avg, stats  
고유 값 개수 cardinality  
백분위 수 분석 percentiles, percentile_ranks  

9. 마무리

Metrics Aggregations을 활용하면 데이터 분석이 가능
백분위 수, 고유 값 개수 등을 통해 인사이트 도출 가능
Elasticsearch를 통계 분석 플랫폼으로 활용 가능

다음 학습에서는 고급 Aggregations 및 성능 최적화 전략을 다루겠습니다! 🚀

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