ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13. 집계(Aggregation)
    BackEnd/elasticsearch 2021. 10. 6. 22:04
    반응형

      집계(Aggregation)는 데이터를 그룹화하고 통계를 구하는 기능입니다. 엘라스틱서치는 SQL보다 더욱 강력한 집계 기능을 제공합니다. 집계를 여러 개 중첩해 사용할수 있을 뿐만 아니라 범위, 날짜, 위치 정보도 집계할 수 있습니다. 또한 엘라스틱서치는 인덱스를 활용해 분산 처리가 가능하기 때문에 SQL보다 더 많은 데이터를 빠르게 집계할 수 있습니다.

     

    [캐시]

      캐시는 질의의 결과를 임시 버퍼에 두고 이후 처리해야 하는 같은 질의에 대해 매번 결과를 계산하는 것이 아니라 버퍼에 보관된 결과를 반환합니다. 일반적으로 힙 메모리의 1%를 할당하며, 엘라스틱서치의 conf 폴더 안의 elasticsearch.yml 파일을 수정해 활성화할 수 있습니다.

    # 힙 메모리의 2%를 캐시에 할당한 예
    indices.requests.cache.size: 2%

    1) Node Query Cache

      노드의 모든 샤드가 공유하는 LRU(Least-Recently-Used) 캐시입니다. 캐시 용량이 가득차면 사용량이 가장 적은 데이터를 삭제하고 새로운 결괏값을 캐싱합니다. 기본적으로 10%의 필터 캐시가 메모리를 제어하고 쿼리 캐싱을 사용할지 여부는 elasticsearch.yml 파일에 옵션으로 추가하면 됩니다. 기본값은 true입니다.

    index.queries.cache.enabled:true

    2) Shard request Cache

      샤드에서 수행된 쿼리의 결과를 캐싱합니다. 샤드의 내용이 변경되면 캐시가 삭제되기 때문에 업데이트가 빈번한 인덱스에서는 오히려 성능 저하를 일으킬 수 있습니다.

     

    3) Field data Cache

      엘라스틱서치는 필드에서 집계 연산을 수행할 때 모든 필드 값을 메모리에 로드합니다. 그러므로 집계 쿼리는 성능적인 측면에서 비용이 많이 듭니다. Field data Cache는 집계가 계산되는 동안 필드의 값을 메모리에 보관합니다.

     

    [참고]

      엘라스틱서치는 버킷(Bucket), 메트릭(Metric), 파이프라인(Pipeline), 행렬(Matrix) 총 4가지 방식의 집계 연산을 지원합니다. 다만, 행렬 집계의 경우는 아직 공식적으로 제공하지 않는 실험적인 기능이기에 실질적으로는 버킷, 메트릭, 파이프라인 집계로 세 가지 집계 연산이 제공됩니다.

     

    [집계 구문의 구조]

    "aggregations" : {                        # "aggregations" or "aggs"
    	"<aggregation_name>" : {              # 집계 이름 (집계 결과 출력에 사용)
        	"<aggregation_type>" : {          # terms, data_histogram, sum 등 집계 유형
            	<aggregation_body>
            }
            [,"meta" : { [<meta_data_body>] } ]?
            [,"aggregations" : { [<sub_aggregation>]+ } ]?
        }
        [,"<aggregation_name_2>" : { ... } ]* # 같은 레벨의 또다른 집계 (부수적인 성격의 집계만 정의 가능)
    }

     

    [집계 영역(Aggregation Scope)]

    # 질의에 해당하는 문서들 내에서 집계 수행
    {
      "query" : {       # 질의 수행. 필터 조건에 의해 명시한 필드와 값이 일치하는 문서만 반환
        "constant_score" : {
          "filter" : {
            "match" : <필드 조건>
          }
        }
      },
      "aggs" : {        # 질의를 통해 반환받은 문서들의 집합 내에서 집계 수행
        "<집계 이름>": {
          "<집계 타입>": {
            "field": "<필드명>"
          }
        }
      }
    }
    
    # 전체 문서에 대해 집계 수행
    {
      "size" : 0,       # 질의 생략 시 match_all 쿼리 수행. size가 0이기에 결과 집합 문서 미출력
      "aggs" : {        # 결과 문서가 출력되지 않더라도 전체 문서에 대해 집계 수행
        "<집계 이름>": {
          "<집계 타입>": {
            "field": "<필드명>"
          }
        }
      }
    }
    
    # 글로벌 버킷 사용 (한 번의 집계로 질의에 해당하는 문서와 전체 문서에 대해 집계 수행)
    {
      "query" : {
        "constant_score" : {
          "filter" : {
            "match" : <필드 조건>
          }
        }
      },
      "aggs" : {
        "<집계 이름>": {
          "<집계 타입>": {         # 일반 버킷: 질의 영역 내에서만 집계 수행
            "field": "<필드명>"
          }
        },
        "<집계 이름>": {
          "global": {},            # 글로벌 버킷: 전체 문서를 대상으로 집계 수행
          "aggs": {
            "<집계 이름>": {
              "<집계 타입>": {
                "field": "<필드명>"
              }
            }
          }
        }
      }
    }

     

    반응형

    'BackEnd > elasticsearch' 카테고리의 다른 글

    15. 버킷 집계(Bucket Aggregations)  (0) 2021.10.09
    14. 메트릭 집계(Metrics Aggregations)  (0) 2021.10.09
    12. Query DSL의 주요 쿼리  (0) 2021.10.02
    11. Query DSL 구조 및 파라미터  (0) 2021.10.02
    10. 검색 API  (0) 2021.09.25

    댓글

Designed by Tistory.