ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 15. 버킷 집계(Bucket Aggregations)
    BackEnd/elasticsearch 2021. 10. 9. 10:36
    반응형

      버킷 집계(Bucket Aggregations)는 메트릭 집계와 다르게 메트릭을 계산하지 않고 버킷을 생성합니다. 생성되는 버킷은 쿼리와 함께 수행되어 쿼리 결과에 따른 컨텍스트 내에서 집계가 이루어 집니다. 이렇게 집계된 버킷은 또 다시 하위에서 집계를 한 번 더 수행해서 집계된 결과에 대해 중첩된 집계를 수행하는 것이 가능합니다. 버킷을 생성한다는 것은 집계된 결과 데이터 집합을 메모리에 저장한다는 의미이기 때문에 중첩되는 단계가 깊어질수록 메모리 사용량은 점점 더 증가해서 성능에 악영향을 줄 수 있습니다.

    # 사용 가능한 최대 버킷 수 -1(전체대상)
    search.max_buckets

     

    1. 범위 집계(Range Aggregations)

      from과 to 속성을 지정하는데 from을 시작으로 to까지의 범위 내에서 집계가 수행됩니다. to에 지정한 값은 결과에서 제외되므로 주의해야 합니다.

    GET /apache-web-log/_search?size=0
    {
        "aggs" : {
            "bytes_range" : {
                "range": {
                  "field": "bytes",
                  "ranges": [          # 여러 개의 범위 지정 가능
                    {
                      "key": "small",  # 생략 시 결과로 제공되는 key에 기본적으로 범위가 지정
                      "to": 1000
                    },
                    {
                      "key": "medium",
                      "from": 1000,
                      "to": 2000
                    },
                    {
                      "key": "large",
                      "from": 2000,
                      "to": 3000
                    }
                  ]
                }
            }
        }
    }

     

    2. 날짜 범위 집계(Date Range Aggregations)

      범위 집계와 마찬가지로 마지막 날짜는 제외되며 여러 개의 날짜 범위 지정과 key 값을 사용자가 정의할 수 있습니다. 날짜 형식으로는 엘라스틱서치에서 지원하는 형식만 사용해야 합니다. [공식 매뉴얼]

    GET /apache-web-log/_search?size=0
    {
        "aggs" : {
            "request count with date range" : {
                "date_range": {
                  "field": "timestamp",
                  "ranges": [
                    {
                      "from": "2015-01-04T05:14:00.000Z",
                      "to": "2015-01-04T05:16:00.000Z"
                    }
                  ]
                }
            }
        }
    }

     

    3. 히스토그램 집계(Histogram Aggregations)

      숫자 범위를 처리하기 위한 집계입니다. 지정한 수치가 간격을 나타내고, 이 간격의 범위 내에서 집계를 수행합니다.

    GET /apache-web-log/_search?size=0
    {
        "aggs" : {
            "bytes_histogram" : {
                "histogram" : {
                    "field" : "bytes",
                    "interval": 10000,
                    "min_doc_count": 1 # 구간별 최소 1개 이상의 문서를 포함한 경우만 결과 반환
                }
            }
        }
    }

     

    4. 날짜 히스토그램 집계(Date Histogram Aggregation)

      히스토그램 집계는 숫자 값을 간격으로 삼아 구간별 집계를 수행한 반면 날짜 히스토그램 집계는 분, 시간, 월, 연도를 구간으로 집계를 수행할 수 있습니다.

    GET /apache-web-log/_search?size=0
    {
        "aggs" : {
            "daily_request_count" : {
                "date_histogram": {
                  "field": "timestamp",
                  # interval : year, quarter, month, week, day, hour, minute, second, 30m(30분), 1.5h(1시간 30분 간격) 등
                  "interval": "day",
                  # format : 반환되는 날짜 형식 변경
                  "format": "yyyy-MM-dd"
                  # "time_zone": "+09:00" # UTC 기준의 날짜 데이터를 한국시간으로 변경 시 사용
                  # "offset": "+3h"       # 결과로 반환되는 날짜 값에 3시간을 더함
                }
            }
        }
    }

     

    5. 텀즈 집계(Terms Aggregations)

      버킷이 동적으로 생성되는 다중 버킷 집계로 집계시 지정한 필드에 대해 빈도수가 높은 텀의 순위로 결과를 반환합니다. 이를 통해 가장 많이 접속하는 사용자를 알아낸다거나 국가별로 어느 정도의 빈도로 서버에 접속하는지 등의 집계를 수행할 수 있습니다. 텀즈 집계의 필드 값으로는 형태소 분석이 필요 없는 Keyword 데이터 타입을 사용해야 합니다.

    # 요청
    GET /apache-web-log/_search?size=0
    {
      "aggs" : {
        "request count by country" : {
          "terms" : {
            "field" : "geoip.country_name.keyword",
            "size": 100
          }
        }
      }
    }
    
    # 요청 시 size 값을 지정하지 않은 결과
      ... 생략 ...
      "aggregations": {
        "request count by country": {
        "doc_count_error_upper_bound": 47, # 문서 수에 대한 오류의 상한선 (근사치 계산)
        "sum_other_doc_count": 2334,       # 결과에 포함되지 않은 모든 문서 수
          "buckets": [                     # 최상위 버킷 목록(size만큼 반환. 기본값 10)
            {
              "key": "United States",      # 질의 시 지정한 필드
              "doc_count": 3974            # 필드 값과 동일한 문서 수
            },
            {
              "key": "France",
              "doc_count": 855
            },
            ... 생략 ...
          ]
        }
      }

      집계를 수행할 때는 각 샤드에 집계 요청을 전달하고, 각 샤드는 집계 결과에 대해 정렬을 수행한 자체 뷰를 갖게 됩니다. 이것들을 병합해서 최종 뷰를 만들기 때문에 포함되지 않은 문서(상위 결과의 sum_other_doc_count)가 존재하는 경우에는 집계 결과가 정확하지 않을 수 있습니다. 집계에 포함되지 않은 문서들을 포함하기 위해 size 값을 늘리면 그만큼 집계의 정확도가 높아지지만 버킷에 더 많은 양의 데이터를 담아야 하기 때문에 메모리 사용량과 결과를 계산하는 데 드는 처리 비용 또한 증가합니다. (정확도와 속도 사이에는 항상 트레이드오프가 있습니다.)

    반응형

    댓글

Designed by Tistory.