[LV 3] Aggregation (집계) 심화 학습
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 | 기존 집계 결과를 이용한 추가 연산 (이동 평균 등) |