-
14. 메트릭 집계(Metrics Aggregations)BackEnd/elasticsearch 2021. 10. 9. 09:08반응형
메트릭 집계(Metrics Aggregations)를 사용하면 특정 필드에 대해 합이나 평균을 계산하거나 다른 집계와 중첩해서 결과에 대해 특정 필드의 _score 값에 따라 정렬을 수행하거나 지리 정보를 통해 범위 계산을 하는 등의 다양한 집계를 수행할 수 있습니다. 일반적으로 필드 데이터를 사용해 집계가 이뤄지지만 스크립트를 사용해 조금 더 유연하게 집계를 수행할 수도 있습니다.
1. 구조
# 요청 구조 GET /apache-web-log/_search?size=0 # 집계된 문서들의 데이터는 불필요하므로 size=0 지정 { "aggs": { # aggregation or aggs "<집계 이름>": { "<집계 타입>": { # sum, avg, min, max, value_count 등 "field": "<필드명>" } } } } # 결과 구조 { "took": 1, # 검색 실행 소요 시간(ms) "time_out": false, # 검색 시간 초과 여부 "_shards": { # 영향받은 샤드 정보 "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { # 검색 결과 "total": 200, # 총 문서 수 "max_score": 0, # 검색 결과에 포함된 최대 스코어 값 "hits": [] # 검색 결과 문서들의 배열(기본 10개 문서 반환) }, "aggregations": { # 집계 결과 "<집계 이름>": { <집계 결과> } } }
2. 단일 숫자 메트릭 집계(single-value numeric metrics aggregation)
집계를 수행한 결괏값이 하나라는 의미로 sum, avg, min, max, value_count 등이 속합니다.
1) 합, 평균, 최대/최솟값, 개수 집계
# 합산 집계 예 GET /apache-web-log/_search?size=0 { "query" : { # 쿼리 컨텍스트 "constant_score" : { # 필터에 해당하는 문서들에 대해 동일한 스코어 부여 "filter" : { # 필터 컨텍스트 "match" : { "geoip.city_name" : "Paris" } # geoip.city_name 필드 값이 'Paris'인 문서 검색 } } }, "aggs": { "total_bytes": { "sum": { # 스크립트 컨텍스트, 6.x부터 그루비(Groovy)가 아닌 페인리스(Painless)를 기본 언어로 사용 "script": { # 기본값으로 따로 명시하지 않아도 됨 "lang": "painless", # bytes 필드를 사용하기 위해 doc 객체의 bytes 속성 변수 사용 # 값을 얻기 위해 bytes 객체의 value 속성 변수를 사용 # bytes 필드 값을 script 내 params(변수)에 명시한 값으로 나눔 "source": "doc.bytes.value / (double)params.divide_value", # script 내 사용할 파라미터 값 정의 "params": { "divide_value": 1024 } } } } } } # 합산/평균/최솟값/최댓값/개수 집계 예 GET _search?size=0 { "query" : { "constant_score" : { "filter" : { "match" : { "geoip.city_name" : "Paris" } } } }, "aggs": { "<집계이름>": { # total_bytes, avg_bytes, min_bytes, max_bytes, bytes_count "<집계타입>": { # sum, avg, min, max, value_count "field": "bytes" } } } }
2) 카디널리티 집계(Cardinality Aggregation)
개수 집합과 유사하게 횟수를 계산하는데, 중복된 값은 제외한 고유한 값에 대한 집계를 수행합니다. 다만 모든 문서에 대해 중복된 값을 집계하는 것은 성능에 큰 영향을 줄 수 있기 때문에 근사치를 통해 집계를 수행합니다. (HyperLogLog++ 알고리즘)
# 미국 내 몇 개의 도시에서 유입되었는지 집계 GET /apache-web-log/_search?size=0 { "query" : { "constant_score" : { "filter" : { "match" : { "geoip.country_name" : "United States" } } } }, "aggs": { "us_cardinality": { "cardinality": { "field": "geoip.city_name.keyword" } } } }
3. 다중 숫자 메트릭 집계(multi-value numeric metrics aggregation)
집계를 수행한 결괏값이 여러 개가 될 수 있고, stats나 geo_bounds가 이에 속합니다.
1) 통계 집계(Stats Aggregation), 확장 통계 집계(Extended Stats Aggregation)
통계 집계를 사용하면 합, 평균, 최대/최솟값, 개수를 한번의 쿼리로 집계할 수 있습니다. 확장 통계 집계는 통계 집계를 확장해서 표준편차 같은 통곗값이 추가됩니다.
# 요청 GET /apache-web-log/_search?size=0 { "query" : { "constant_score" : { "filter" : { "match" : { "geoip.city_name" : "Paris" } } } }, "aggs": { "bytes_stats": { "stats": { # 확장 통계 집계 : extended_stats "field": "bytes" } } } } # 결과 { ... 생략 ... "aggregations": { "bytes_stats": { "count": 21, "min": 1015, "max": 53270, "avg": 20426.85714285714, "sum": 428964 # 확장 통계 집계 "sum_of_squares": 118280314234513340, # 제곱합 "variance": 12590713617814.016, # 분산 "std_deviation": 3548339.5578515334, # 표준편차 "std_deviation_bounds": { "upper": 7391135.975831684, "lower": -6802222.25557445 } } } }
2) 백분위 수 집계(Percentiles Aggregation)
백분위 수 집계 또한 카디널리티 집계와 같이 근사치 계산으로 집계됩니다. 문서들의 집합에서 특정 필드에 대한 백분위 수를 구해야 하기 때문에 카디널리티 집계와는 달리 TDigest 알고리즘을 사용합니다. 카디널리티 집계와 마찬가지로 문서들의 집합 크기가 작을수록 정확도는 더 높아지고, 커질수록 점점 더 근사치를 계산하게 됩니다.
# 요청 GET /apache-web-log/_search?size=0 { "aggs": { "bytes_percentiles": { "percentiles": { "field": "bytes", # 기본적으로 지정되는 백분위 수 외 직접 백분위를 입력할 수 있음. "percents": [10, 20, 30, 40, 50, 60, 70, 80, 90] } } } } # 결과 { ... 생략 ... "aggregations": { "bytes_percentiles": { "values": { "10.0": ..., "20.0": ..., "30.0": ..., ... "90.0": ..., } } } }
3) 백분위 수 랭크 집계(Percentile Ranks Aggregation)
백분위 수 집계의 경우 백분위를 지정해서 각 백분위의 수에 해당하는 수치를 확인할 수 있었다면 백분위 수 랭크의 경우 특정 필드 수치를 통해 백분위의 어느 구간에 속하는지 확인할 수 있습니다.
# 요청 GET /apache-web-log/_search?size=0 { "aggs": { "bytes_percentile_ranks": { "percentile_ranks": { "field": "bytes", "values": [5000, 10000] } } } } # 결과 { ... 생략 ... "aggregations": { "bytes_percentile_ranks": { "values": { "5000.0": 32.364074091834475, "10000.0": 45.06109516861249 } } } }
4) 지형 경계 집계(Geo Bounds Aggregation), 지형 중심 집계(Geo Centroid Aggregation)
지형 경계 집계는 지형 좌표(필드 타입 : geo_point)를 포함하고 있는 필드에 대해 해당 지역 경계 상자를 계산하는 메트릭 집계입니다. 지형 중심 집계는 지형 경계 집계의 범위에서 정가운데의 위치를 반환합니다.
# 지형 경계 집계 GET /apache-web-log-applied-mapping/_search?size=0 { "aggs" : { "viewport" : { "geo_bounds" : { "field" : "geoip.location", "wrap_longitude" : true } } } } # 지형 중심 집계 GET /apache-web-log-applied-mapping/_search?size=0 { "aggs" : { "centroid" : { "geo_centroid" : { "field" : "geoip.location" } } } }
반응형'BackEnd > elasticsearch' 카테고리의 다른 글
16. 파이프라인 집계(Pipeline Aggregations) (0) 2021.10.09 15. 버킷 집계(Bucket Aggregations) (0) 2021.10.09 13. 집계(Aggregation) (0) 2021.10.06 12. Query DSL의 주요 쿼리 (0) 2021.10.02 11. Query DSL 구조 및 파라미터 (0) 2021.10.02