BackEnd/Elasticsearch

13. 집계(Aggregation)

hanseom 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": "<필드명>"
          }
        }
      }
    }
  }
}

 

반응형