OpenSearch 집계
OpenSearch 집계 (Aggregations)
OpenSearch는 검색만 하는 게 아니에요. **집계(aggregations)**를 쓰면 OpenSearch의 분석 엔진으로 데이터를 분석하고 통계를 뽑아낼 수 있어요. 실시간으로 데이터를 분석해 조치를 취하거나, OpenSearch Dashboards로 시각화 대시보드를 만드는 데도 쓰여요. 방대한 데이터셋도 밀리초 단위로 집계할 수 있지만, 쿼리보다 CPU와 메모리를 더 많이 써요.
기본 구조
집계 쿼리의 기본 구조는 다음과 같아요. 집계 결과만 필요하고 쿼리 결과는 필요 없다면 size를 0으로 설정하면 돼요.
GET _search
{
"size": 0,
"aggs": {
"<aggregation_name>": {
"<aggregation_type>": {}
}
}
}
aggs(원하면 aggregations도 가능) 프로퍼티에 원하는 만큼 집계를 정의할 수 있어요. 각 집계는 이름과 OpenSearch가 지원하는 집계 유형으로 구성돼요. 집계 이름은 응답에서 서로 다른 집계를 구분하는 역할을 해요.
예제: 평균 구하기
OpenSearch Dashboards의 샘플 e-commerce 데이터에서 taxful_total_price 필드의 평균을 구하는 예제예요.
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"avg_taxful_total_price": {
"avg": {
"field": "taxful_total_price"
}
}
}
}
응답의 aggregations 블록에 계산된 평균값이 들어 있어요.
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4675,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"avg_taxful_total_price" : {
"value" : 75.05542864304813
}
}
}
집계 유형
집계는 크게 세 가지 유형으로 나뉘어요.
- 메트릭 집계(Metric aggregations): 숫자 필드에서
sum,min,max,avg같은 지표를 계산해요. - 버킷 집계(Bucket aggregations): 어떤 기준으로 쿼리 결과를 그룹으로 나눠요.
- 파이프라인 집계(Pipeline aggregations): 한 집계의 출력을 다른 집계의 입력으로 연결해요.
메트릭 집계
avg– 평균값 계산cardinality– 고유 값 개수extended_stats– 표준편차를 포함한 종합 통계max– 최댓값min– 최솟값percentile– 백분위수 (예: 중앙값, 95번째 백분위수)stats– 기본 통계 (count,sum,min,max,avg)sum– 값의 합계value_count– null이 아닌 값의 개수
버킷 집계
terms– 고유 필드값으로 그룹화date_histogram– 시간 간격으로 그룹화histogram– 숫자 간격으로 그룹화range– 숫자 범위로 그룹화filter– 필터 하나에 매칭되는 단일 버킷 생성filters– 필터마다 버킷을 여러 개 생성missing– 필드값이 없는 문서 그룹화significant_terms– 데이터셋에서 특이하거나 흥미로운 용어 찾기
파이프라인 집계
avg_bucket– 버킷 전체의 평균 계산cumulative_sum– 버킷 전체의 누적 합계 계산bucket_sort– 반환되는 버킷 정렬 및 개수 제한
중첩 집계 (Nested aggregations)
집계 안의 집계를 중첩 집계(subaggregation)라고 불러요. 메트릭 집계는 단순한 결과를 만들어 내서 중첩 집계를 담을 수 없어요. 반면 버킷 집계는 문서 버킷을 만들어 내므로, 그 안에 메트릭·버킷 집계를 중첩해 복잡한 분석을 할 수 있어요. 내부 aggs 키워드가 새로운 중첩 집계를 시작해요.