ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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" 
                }
            }
        }
    }

     

    반응형

    댓글

Designed by Tistory.