Aggregations
출처: 문서
본문
애그리게이션
OpenSearch는 검색만을 위한 것이 아니에요. 애그리게이션을 사용하면 OpenSearch의 강력한 분석 엔진을 활용해 데이터를 분석하고 그로부터 통계를 추출할 수 있어요.
애그리게이션의 활용 사례는 실시간으로 데이터를 분석해 어떤 조치를 취하는 것부터 OpenSearch Dashboards를 사용해 시각화 대시보드를 만드는 것까지 다양해요.
OpenSearch는 대규모 데이터셋에 대해 밀리초 만에 애그리게이션을 수행할 수 있어요. 쿼리에 비해 애그리게이션은 더 많은 CPU 사이클과 메모리를 소비해요.
일반적인 애그리게이션 구조
애그리게이션 쿼리의 구조는 다음과 같아요:
GET _search
{
"size": 0,
"aggs": {
"<aggregation_name>": {
"<aggregation_type>": {}
}
}
}
{% include copy-curl.html %}
쿼리 결과가 아니라 애그리게이션 결과에만 관심이 있다면 size를 0으로 설정하세요.
aggs 속성에서(원한다면 aggregations를 사용해도 돼요) 원하는 만큼 많은 애그리게이션을 정의할 수 있어요. 각 애그리게이션은 이름과 OpenSearch가 지원하는 애그리게이션 타입 중 하나로 정의돼요.
애그리게이션의 이름은 응답에서 서로 다른 애그리게이션을 구별하는 데 도움이 돼요. <aggregation_type> 플레이스홀더는 sum이나 min 같은 애그리게이션 타입을 지정해요.
애그리게이션 예제
다음 예제는 OpenSearch Dashboards 샘플 전자상거래 데이터를 사용해요. 샘플 데이터를 추가하려면 OpenSearch Dashboards에 로그인한 다음 Home을 선택하고 Try our sample data를 선택하세요. Sample eCommerce orders에서는 Add data를 선택하세요.
이 예제는 avg 애그리게이션을 사용해 taxful_total_price 필드의 평균값을 구해요:
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"avg_taxful_total_price": {
"avg": {
"field": "taxful_total_price"
}
}
}
}
{% include copy-curl.html %}
응답에는 계산된 평균값이 담긴 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
}
}
}
애그리게이션 타입
세 가지 주요 애그리게이션 타입이 있어요:
- 메트릭 애그리게이션 -- 숫자 필드에 대해
sum,min,max,avg같은 메트릭을 계산해요. - 버킷 애그리게이션 -- 어떤 기준에 따라 쿼리 결과를 그룹으로 나눠요.
- 파이프라인 애그리게이션 -- 한 애그리게이션의 출력을 다른 애그리게이션의 입력으로 전달해요.
메트릭 애그리게이션
메트릭 애그리게이션은 숫자 필드 값에 대한 통계를 계산해요:
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-- 반환되는 버킷을 정렬하고 개수를 제한해요.
파이프라인 애그리게이션의 전체 목록은 파이프라인 애그리게이션을 참조하세요.
중첩 애그리게이션
애그리게이션 안에 들어 있는 애그리게이션을 중첩 애그리게이션 또는 _서브 애그리게이션_이라고 불러요.
메트릭 애그리게이션은 단순한 결과를 만들어내기 때문에 중첩 애그리게이션을 포함할 수 없어요.
버킷 애그리게이션은 다른 애그리게이션 안에 중첩할 수 있는 문서 버킷을 만들어내요. 버킷 애그리게이션 안에 메트릭 애그리게이션과 버킷 애그리게이션을 중첩하면 데이터에 대해 복잡한 분석을 수행할 수 있어요.
일반적인 중첩 애그리게이션 문법
{
"aggs": {
"name": {
"type": {
"data"
},
"aggs": {
"nested": {
"type": {
"data"
}
}
}
}
}
}
안쪽의 aggs 키워드는 새로운 중첩 애그리게이션을 시작해요. 부모 애그리게이션과 중첩 애그리게이션의 문법은 서로 같아요. 중첩 애그리게이션은 바로 앞의 부모 애그리게이션 컨텍스트 안에서 실행돼요.
중첩 애그리게이션 예제
다음 예제는 OpenSearch Dashboards 샘플 전자상거래 데이터를 사용해 주문을 카테고리별로 그룹화하고 각 카테고리 내의 평균 가격을 계산해요. 이 쿼리는 알파벳 내림차순으로 정렬된 상위 5개 카테고리를 반환해요:
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"categories": {
"terms": {
"field": "category.keyword",
"size": 5,
"order": {
"_key": "desc"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "taxful_total_price"
}
}
}
}
}
}
{% include copy-curl.html %}
응답에는 각 카테고리에 대한 버킷이 알파벳 내림차순으로 정렬되어 포함되고, 각 버킷 안에서 평균 가격이 계산돼요:
{
"took" : 22,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4675,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"categories" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 572,
"buckets" : [
{
"key" : "Women's Shoes",
"doc_count" : 1136,
"avg_price" : {
"value" : 92.8513836927817
}
},
{
"key" : "Women's Clothing",
"doc_count" : 1903,
"avg_price" : {
"value" : 70.99312352207042
}
},
{
"key" : "Women's Accessories",
"doc_count" : 830,
"avg_price" : {
"value" : 73.28953313253012
}
},
{
"key" : "Men's Shoes",
"doc_count" : 944,
"avg_price" : {
"value" : 97.24356130826271
}
},
{
"key" : "Men's Clothing",
"doc_count" : 2024,
"avg_price" : {
"value" : 73.81122043292984
}
}
]
}
}
}
중첩 애그리게이션의 추가 예제는 파이프라인 애그리게이션을 참조하세요.
애그리게이션을 검색 쿼리와 결합하면 집계하기 전에 분석할 데이터 범위를 좁힐 수도 있어요. 쿼리를 추가하지 않으면 OpenSearch가 암묵적으로 match_all 쿼리를 사용해요.
애그리게이션 사용하기
애그리게이션은 OpenSearch API를 통해서도, OpenSearch Dashboards를 통해서도 사용할 수 있어요.
애그리게이션 API 사용하기
cURL 같은 도구를 사용해 명령줄에서 애그리게이션 요청을 실행하거나, OpenSearch Dashboards Dev Tools 콘솔에서 실행할 수 있어요. Dev Tools 콘솔 사용 방법에 대한 자세한 내용은 Dev Tools 콘솔에서 쿼리 실행하기를 참조하세요.
샘플 API 요청과 응답은 애그리게이션 예제 섹션과 중첩 애그리게이션 예제 섹션을 참조하세요. 각 애그리게이션 타입의 자세한 문법과 파라미터는 애그리게이션 타입 섹션에 나열된 타입별 문서 페이지를 참조하세요. 샘플 데이터셋을 대상으로 애그리게이션을 실행하는 실습 튜토리얼은 애그리게이션으로 데이터 요약하기를 참조하세요.
OpenSearch Dashboards에서 애그리게이션 사용하기
애그리게이션은 OpenSearch Dashboards의 다양한 시각화 타입을 뒷받침해요. 시각화를 만들 때 OpenSearch Dashboards가 여러분의 선택에 따라 애그리게이션 쿼리를 자동으로 생성해요. OpenSearch Dashboards가 처음이라면 OpenSearch Dashboards 시작하기를 참조하세요.
Visualize 애플리케이션에서 볼 수 있는 메트릭 및 버킷 옵션은 이 페이지에서 설명하는 애그리게이션 타입과 대응돼요. Count가 기본 Y축 메트릭인데, 각 버킷의 문서 수(doc_count)를 표시하며 필드 선택이 필요하지 않아요.
Visualize 애플리케이션에서 사용할 수 있는 메트릭은 다음과 같아요: Count, Average, Max, Median, Min, Percentile Ranks, Percentiles, Standard Deviation, Sum, Top Hit, Unique Count, Cumulative Sum, Derivative, Moving Avg, Serial Diff, Average Bucket, Max Bucket, Min Bucket, Sum Bucket.
Visualize 애플리케이션에서 사용할 수 있는 버킷 애그리게이션은 다음과 같아요: Date Histogram, Date Range, Filters, Histogram, IPv4 Range, Range, Significant Terms, Terms.
각 옵션에 대한 설명과 Aggregations API와의 매핑 방식은 시각화 구성을 참조하세요. 실습 튜토리얼은 애그리게이션 기반 시각화 만들기를 참조하세요.
텍스트 필드에 대한 애그리게이션
기본적으로 OpenSearch는 text 필드에 대한 애그리게이션을 지원하지 않아요. text 필드는 토큰화되기 때문에, text 필드에 대한 애그리게이션은 토큰화 과정을 역으로 되돌려 원래 문자열을 복원한 다음 그것을 바탕으로 애그리게이션을 구성해야 해요. 이런 종류의 연산은 상당한 메모리를 소모하고 클러스터 성능을 떨어뜨려요.
매핑에서 fielddata 파라미터를 true로 설정하면 text 필드에 대한 애그리게이션을 활성화할 수 있지만, 그런 애그리게이션은 여전히 토큰화된 단어를 기반으로 하지 원시 텍스트를 기반으로 하지 않아요.
text 필드의 원시 버전을 애그리게이션을 수행할 수 있는 keyword 필드로 유지하는 것을 권장해요.
다음 예제는 raw라는 이름의 keyword 서브필드를 가진 product_name 필드를 만들어요. product_name 대신 product_name.raw에 대해 애그리게이션을 수행할 수 있어요:
PUT products
{
"mappings": {
"properties": {
"product_name": {
"type": "text",
"fielddata": true,
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
{% include copy-curl.html %}
매핑에 대한 자세한 내용은 매핑을 참조하세요.
제한 사항
애그리게이터는 모든 값을 double 데이터 타입으로 처리하기 때문에, 253 이상의 long 값은 근사치로 계산돼요.
다음 단계
- 메트릭 애그리게이션을 살펴보고 데이터에 대한 통계를 계산해 보세요.
- 버킷 애그리게이션을 학습해 카테고리, 범위 또는 시간 간격별로 데이터를 그룹화하고 분석해 보세요.
- 파이프라인 애그리게이션을 알아보고 다른 애그리게이션의 출력을 활용한 고급 분석을 해 보세요.
- 애그리게이션을 사용해 OpenSearch Dashboards에서 시각화를 만들어 보세요.