-
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