
Elasticsearch에서는 _search API의 aggs 또는 aggregations 속성으로 데이터를 집계할 수 있음
query와 함께 사용 가능하며, 쿼리 결과 필터 후 집계가 실행됨
Metrics 집계: 수치 연산 계산 결과를 생성
Bucket 집계: 도큐먼트를 그룹화하여 버킷 생성
Sub-aggregation: Bucket 내부에 또 다른 Metrics/Bucket 적용
Pipeline 집계: 이전 집계 결과를 입력으로 추가 연산
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]
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: 페이징 가능한 복합 버킷 (대량 처리에 유리): 버킷마다 내부 연산을 추가 적용
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" } } } } }
: 이전 집계 결과를 입력으로 후처리 수행
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: 정규화 (백분율 등)
"aggs": { "by_month_store": { "composite": { "sources": [ { "month": { "date_histogram": { "field": "date", "calendar_interval": "month" } } }, { "store": { "terms": { "field": "store.keyword" } } } ] } } }
| 목적 | 조합 |
|---|---|
| 카테고리별 평균 계산 | 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-agg | Bucket 안 재집계 | bucket → metric 또는 bucket |
| Pipeline | 집계 결과 후추가 연산 | cumulative_sum, sum_bucket, derivative 등 |