검색엔진 스터디

05장 데이터 집계

막이86 2023. 11. 8. 17:28
728x90

엘라스틱서치 실무 가이드 5장을 요약한 내용입니다.

  • 데이터를 그룹화해서 각종 통계 지표를 제공하기 위해 집계 기능을 제공
  • SQL에서 제공하는 Group By 연산과 비슷하다

5.1 집계

  • 집계는 데이터를 그룹화하고 통계를 구하는 기능

5.1.1 엘라스틱서치와 데이터 분석

  • 대용량의 데이터를 처리하기 위해 데이터를 조각내어 관리
  • 문서의 수가 늘어나도 배치 처리보다 좀 더 실시간에 가깝게 문서 처리 가능
  • 영화별로 리뷰 점수를 집계하는 예제
    • SQL의 GROUP BY를 사용
    • SELECT SUM(ratings) FROM movie_review GROUP BY movie_no
    • Query DSL 사용
      • 집계를 여러 개 중첩해서 사용 가능
      • 범위, 날짜, 위치 정보도 집계 가능
      {
      	"aggs": {
      		"movie_no_agg": {
      			"terms": {
      				"field": "movie_no"
      			}
      		},
      		"aggs": {
      			"ratings_agg": {
      				"sum": {
      					"field": "ratings"
      				}
      			} 
      		}
      	}
      }
      

5.1.2 엘라스틱서치가 집계에 사용하는 기술

  • 데이터를 분석하는 데 있어서 집계는 검색보다 더 많은 리소스를 사용

캐시

  • 집계 쿼리로 값을 조회하면 엘라스틱서치의 마스터 노드가 여러 노드에 있는 데이터를 집계해 질의에 답변한다.
    • 데이터의 양이 클수로 집계에는 많은 양의 CPU와 메모리 자원이 소모
  • 비용 효율적으로 사용하기 위해서는 엘라스틱서치의 “캐시”를 사용하는 것
  • 캐시를 적용하는 것만으로 인덱스의 성능 대폭 향상
  • 캐시의 크기는 일반적으로 힙 메모리의 1%를 할당
  • 캐시에 없는 질의의 경우 성능 향상에 별다른 도움이 되지 않음
  • 엘라스틱서치는 Node Query Cache, Shard Request Cache, Field Data Cache를 지원

5.1.3 실습 데이터 살펴보기

  • 개발 실습 환경 구축 해야 함

5.1.4 Aggregation API 이해하기

  • 집계 시 문서를 평가한 후 기준에 만족하는 문서들을 하나로 그룹화
  • 그룹화한 집합을 토대로 집계를 수행
  • 버킷 집계
    • 쿼리 결과로 도출된 도큐먼트 집합에 대해 특정 기준을 나눈 다음 나눠진 도큐먼트들에 대한 산술 연산을 수행
  • 메트릭 집계
    • 쿼리 결과로 도출된 도큐먼트 집합에서 필드의 값을 더하거나 평균을 내는 등의 산술 연산을 수행
  • 파이프라인 집계
    • 다른 집계 또는 관련 메트릭 연산의 결과를 집계
  • 행렬 집계
    • 버킷 대상이 되는 도큐먼트의 여러 필드에서 추출한 값으로 행결 연산을 수행
    • 아직은 실험적인 기능으로 제공 됨

집계 구문의 구조

  • 집계 연산을 하기 위한 문법 구조
    • aggregation 대신 aggs로 줄여 사용 가능
    • aggregation_name에는 하위 집계의 이름을 기입
      • 집계 결과 출력에 사용
    • aggregation_type에는 집계 유형을 기입
      • terms, date_histogram, sum 과 같은 집계 유형
    • aggregation_body에는 aggregation_type에 맞는 내용 작성
    • meta 필드를 사용하거나 aggregation을 중첩 가능
    "aggregations": {
    	"<aggregation_name>": {
    		"<aggregation_type": {
    			"<aggregation_body"
    		}
    		[, "meta": { [<meta_data_body>] } ]?
    		[, "aggregations": { [<sub_aggregation>]+ } ]?
    	}
    	[, "<aggregation_name_2>": { ... } ]*
    }
    

집계 영역

  • 질의를 통해 반환된 문서들의 집합 내에서 집계를 수행
  • { "query": { // 필터 조건에 의해 명시된 필드와 같이 일치하는 문서만 반환 "constant_score": { "filter": { "match": <필드 조건> } } }, "aggs": { // 질의를 통해 반환받은 문서들의 집합 내에서 집계를 수행 "<집계 이름>": { "<집계 타입": { "field": "<필드명>" } } } }
  • 질의가 생략된다면 전체 문서에 대해 집계 수행
  • { "size": 0, "aggs": { "<집계 이름>": { "<집계 타입": { "field": "<필드명>" } } } }
  • 한 번의 집계를 통해 질의에 해당하는 문서들 내에서도 집계를 수행하고 전체 문서에 대해서도 집계를 수행할 경우
    • 글로벌 버킷을 사용하여 해결
    {
    	"query": {              
    		"constant_score": {
    			"filter": {
    				"match": "<필드 조건>"
    			}
    		}
    	},
    	"aggs": {                
    		"<집계 이름>": {
    			"<집계 타입": {
    				"field": "<필드명>"
    			}
    		},
    		"<집계 이름>": {
    			"global": {},                       // 전체 문서를 대상으로 집계 수행
    			"aggs": {
    				"<집계 이름>": {
    					"<집계 타입": {
    						"field": "<필드명>"
    					}
    				}
    			}
    		}
    	}
    }
    

5.2 메트릭 집계

  • 메트릭 집계를 사용하면 특정 필드에 대해 합이나 평균을 계산하거나 다른 집계와 중첩해서 결과에 대해 특정 필드의 _score 값에 따라 정렬을 수행하거나 지리 정보를 통해 범위 계산을 하는 등의 다양한 집계를 수행 가능
  • 단일 숫자 메트릭 집계
    • 집계를 수행한 결과 값이 하나라는 의미로 sum, avg등
  • 다중 숫자 메트릭 집계
    • 집계를 수행한 결과 값이 여러 개가 될 수 있고, stats나 geo_bounds 등
  • 집계 요청에 사용될 공통 구조
  • GET /apach-web-log/_search?size=0 { "aggs": { "<집계 이름>": { "<집계 타입": { "field": "<필드명>" } } } }
  • 집계 결과의 공통 구조
  • { "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 200, "max_score": 0, "hits": [] }, "aggregations": { "<집계 이름>": { <집계 결과> } } }

5.2.1 합산 집계

  • 합산 집계는 단일 숫자 메트릭 집계에 해당
  • ex) 서버로 총 얼마만큼의 데이터가 유입됐는지 집계
  • GET /apache-web-log/_search?size=0 { "aggs": { "total_bytes": { "sum": { "field": "bytes" } } } }
  • filter기능을 사용해 특정 지역에서 유입된 데이터의 합을 계산
  • GET /apache-web-log/_search?size=0 { "query": { "constant_score": { "filter": { "match": { "geoip.city_name": "Paris" } } } }, "aggs": { "total_bytes": { "sum": { "field": "bytes" } } } }
  • script를 활용하여 집계되는 데이터를 원하는 단위로 변경 가능
  • GET /apache-web-log/_search?size=0 { "query": { "constant_score": { "filter": { "match": { "geoip.city_name": "Paris" } } } }, "aggs": { "total_bytes": { "sum": { "script": { // 6.x 부터 페인리스(painless)를 기본 언어로 사용 "lang": "painless", // 기본값이기 때문에 따로 명시하지 않아도 됨 "source": "doc.bytes.value" // doc 객체의 bytes 속성 변수를 사용 } } } } }
  • script를 사용하면 다양한 연산 수행 가능
    • KB로 나타나기 위해 1000으로 나누기
    GET /apache-web-log/_search?size=0
    {
    	"query": {
    		"constant_score": {
    			"filter": {
    				"match": { "geoip.city_name": "Paris" }
    			}
    		}
    	},
    	"aggs": {
    		"total_bytes": {
    			"sum": {
    				"script": {                   
    					"lang": "painless",         
    					"source": "doc.bytes.value / params.divide_value", // params에서 정의한 값으로 나눈다
    					"params": {
    						"divide_value": 1000
    					} 
    				}
    			}
    		}
    	}
    }
    
  • 1000보다 작은 값들은 전부 0이 되어 버림
    • 캐스팅 연산을 통해 수정
    GET /apache-web-log/_search?size=0
    {
    	"query": {
    		"constant_score": {
    			"filter": {
    				"match": { "geoip.city_name": "Paris" }
    			}
    		}
    	},
    	"aggs": {
    		"total_bytes": {
    			"sum": {
    				"script": {                   
    					"lang": "painless",         
    					"source": "doc.bytes.value / (double)params.divide_value",
    					"params": {
    						"divide_value": 1000
    					} 
    				}
    			}
    		}
    	}
    }
    

5.2.2 평균 집계

  • 평균 집계는 단일 숫자 메트릭 집계에 해당
  • ex) 서버로 유입된 데이터의 평균 값
  • GET /apache-web-log/_search?size=0 { "aggs": { "avg_bytes": { "avg": { "field": "bytes" } } } }

5.2.3 최솟값 집계

  • 최솟값 집계는 단일 숫자 메트릭 집계에 해당
  • ex) 서버로 유입된 데이터 중 가장 작은 값
  • GET /apache-web-log/_search?size=0 { "aggs": { "min_bytes": { "min": { "field": "bytes" } } } }

5.2.4 최댓값 집계

  • 최대값 집계는 단일 숫자 메트릭 집계에 해당
  • ex) 서버로 유입된 데이터 중 가장 큰 값
  • GET /apache-web-log/_search?size=0 { "aggs": { "max_bytes": { "max": { "field": "bytes" } } } }

5.2.5 개수 집계

  • 개수 집계는 단일 숫자 메트릭 집계에 해당
  • ex) 서버로 사용자 요청이 몇 회 유입됐는지
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_count": { "value_count": { "field": "bytes" } } } }

5.2.6 통계 집계

  • 통계 집계는 결과 값이 여러 개인 다중 숫자 메트릭 집계에 해당
  • ex) 합, 평균, 최대/최소값, 개수를 한번의 쿼리로 조회 가능
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_stats": { "stats": { "field": "bytes" } } } }

5.2.7 확장 통계 집계

  • 확장 통계 집계는 결과 값이 여러 개인 다중 숫자 메트릭 집계에 해당
  • 통계 집계를 확장해서 표준편차 같은 통계 값이 추가
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_extended_stats": { "extended_stats": { "field": "bytes" } } } }

5.2.8 카디널리티 집계

  • 카디널리티 집계는 단일 숫자 메트릭 집계에 해당
  • 개수 집학과 유사하게 횟수를 계산
    • 중복된 값은 제외한 고유한 값에 대한 집계를 수행
    • 성능상 이유로 근사치를 통해 집계를 수행
  • ex) 미국의 몇 개 도시에서 데이터 유입이 있었는지 횟수를 집계
  • GET /apache-web-log/_search?size=0 { "query": { "constant_score": { "filter": { "match": { "geoip.city_name": "United States" } } } }, "aggs": { "us_city_names": { "cardinality": { "field": "geoip.city_name.keyword", } } } }
  • 카디널리티 집계는 대상 필드를 고유한 값으로 근사치를 계산하는 메트릭 집계

5.2.9 백분위 수 집계

  • 백분위 수 집계는 다중 숫자 매트릭 집계에 해당
  • 백분위 수는 크기가 있는 값들로 이뤄진 자료를 순서대로 나열했을 때 백분율로 나타낸 특정 위치의 값
  • 100명의 학생이 100점 만점의 수학 시험
    • 학생들의 점수가 어느 구간에 분포돼 있는지 확인 가능
  • ex) 유입된 데이터가 어느 정도 크기로 분포돼 있는지
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_percentiles": { "percentiles": { "field": "bytes", "percents": [10, 20, 30, 40, 50, 60, 70, 80, 90] // 직접 백분위를 입력 가능 } } } }
  • 백분위 수 집계도 근사치 계산으로 집계

근차치 계산에서 정확도와 메모리 사용량 사이의 적절한 균형을 찾아 내는 것이 중요, 백분위 수 집계에서는 compression 값을 통해 조절 가능

5.2.10 백분위 수 랭크 집계

  • 백분위 수 랭크 집계는 다중 숫자 메트릭 집계에 해당
  • 특정 필드 수치를 통해 백분위의 어느 구간에 속하는지 확인
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_percentile_ranks": { "percentile_ranks": { "field": "bytes", "values": [5000, 10000] } } } }

5.2.11 지형 경계 집계

  • 지형 경계 집계는 지형 좌표를 포함하고 있는 필드에 대해 해당 지역 경계 상자를 계산하는 메트릭 집계
  • GET /apache-web-log-applied-mapping/_search?size=0 { "aggs": { "viewport": { "geo_bounds": { "field": "geoip.location", "wrap_longitude": true } } } }
  • 위도, 경도 수치만 봐서는 범위를 짐작하기 어려움
    • 키바나에서 제공하는 차트로 좌표 정보를 시각화해서 제공

5.2.12 지형 중심 집계

  • 지형 중심 집계는 지형 경계 집계의 범위에서 정가운데의 위치를 반환
  • GET /apache-web-log-applied-mapping/_search?size=0 { "aggs": { "centroid": { "geo_centroid": { "field": "geoip.location" } } } }

5.3 버킷 집계

  • 버킷 집계는 메트릭 집계와 다르게 메트릭을 계산하지 않고 버킷을 생성
  • 생성된 버킷은 쿼리와 함께 수행되어 쿼리 결과에 따른 컨텍스트 내에서 집계가 됨
  • 버킷을 생성한다는 것은 집계된 결과 데이터 집합을 메모리에 저장한다는 의미
    • 중첩 단계가 깊어질수록 메모리 사용량은 증가
  • 엘라스틱서치는 기본적으로 사용 가능한 최대 버킷 수가 미리 정의되어 있음
    • search.max_buckets 값으로 수정 가능
    • 집계 질의를 요청할 때 버킷 크기를 -1 또는 10000 이상의 값을 지정할 경우 경고 메시지를 반환

5.3.1 범위 집계

  • 범위 집계는 사용자가 지정한 범위 내에서 집계를 수행하는 다중 버킷 집계
  • 범위 집계에서는 from과 to 속성을 지정
    • from부터 to 미만의 범위
  • ex) 데이터 크기가 1000바이트에서 2000바이트 사이의 데이터를 대상으로 집계
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_range": { "range": { "field": "bytes", "ranges": [ { "from": 1000, "to": 2000 } ] } } } }
  • 여러 범위와 key 속성으로 좀 더 명확하게 표현 가능
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_range": { "range": { "field": "bytes", "ranges": [ { "key": "small", "to": 1000 }, { "key": "medium", "from": 1000, "to": 2000 }, { "key": "large", "from": 2000, "to": 3000 } ] } } } }

5.3.2 날짜 범위 집계

  • 날짜 범위 집계는 범위 집계와 유사하지만 날짜 값을 범위로 집계를 수행
    • 날짜 형식으로 엘라스틱서치에서 지원하는 형식만 사용
  • 특정 기간 동안 서버로 전달된 요청 수
  • 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" } ] } } } }

5.3.3 히스토그램 집계

  • 히스토그램 집계는 숫자 범위를 처리하기 위한 집계
  • 지정한 수치가 간격을 나타내고, 이 간격의 범위 내에서 집계를 수행
  • ex) 히스토그램의 간격을 1000으로 설정한 경우 1000 간격으로 집계
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_histogram": { "histogram": { "field": "bytes", "interval": 1000 } } } }
  • 구간별로 최소한 1개 이상의 문서를 포함하는 경우만 집계
  • GET /apache-web-log/_search?size=0 { "aggs": { "bytes_histogram": { "histogram": { "field": "bytes", "interval": 1000, "min_doc_count": 1 } } } }

5.3.4 날짜 히스토그램 집계

  • 날짜 히스토그램 집계는 다중 버킷 집계
  • ex) 분 단위로 얼마큼의 사용자 유입이 있었는지 집계
  • GET /apache-web-log/_search?size=0 { "aggs": { "daily_rquest_count": { "date_histogram": { "field": "timestamp", "interval": "minute" } } } }
  • 날짜 형식에 맞게 날짜 형식을 변경
  • GET /apache-web-log/_search?size=0 { "aggs": { "daily_rquest_count": { "date_histogram": { "field": "timestamp", "interval": "day", "format": "yyyy-MM-dd" } } } }
  • 한국 시간의 경우 타임존을 사용하여 계산
  • GET /apache-web-log/_search?size=0 { "aggs": { "daily_rquest_count": { "date_histogram": { "field": "timestamp", "interval": "day", "time_zone": "+09:00" } } } }

5.3.5 텀즈 집계

  • 텀즈 집계는 버킷이 동적으로 생성된느 다중 버킷 집계
  • 집계 시 지정한 필드에 대한 빈도수가 높은 텀의 순위로 결과 반환
  • ex) 국가별로 어느 정도의 빈도로 서버에 접속하는지 집계
  • GET /apache-web-log/_search?size=0 { "aggs": { "request count by country": { "terms": { "field": "geoip.country_name.keyword" } } } }
  • 텀즈 집계 결과에 sum_other_doc_count는 결과에 포함되지 않은 집계 결과가 남아 있다는 의미
    • 포함되지 않은 문서가 존재하는 경우에 집계 결과가 정확하지 않을 수 있음
  • doc_count_error_upper_bound는 최종 집계 결과에 포함되지 않은 잠재 문서의 수
    • 각 샤드별로 반환된 집계 결과 중 최종 병합 과정에서 선택 받지 못한 집계 결과의 가장 마지막 값을 합산한 결과
  • 모든 문서가 포함할 수 있도록 size 값을 100으로 지정
    • size를 늘리면 정확도가 높아짐
    • 메모리 사용량과 결과를 계산하는데 드는 처리 비용 증가
    GET /apache-web-log/_search?size=0
    {
    	"aggs": {
    		"request count by country": {
    			"terms": {
    				"field": "geoip.country_name.keyword",
    				"size": 100
    			}
    		}
    	}
    }
    

5.4 파이프라인 집계

  • 다른 집계로 생성된 버킷을 참조해 집계를 수행
    • 집계 또는 중첩된 집계를 통해 생성된 버킷을 사용해 추가적인 계산을 수행
  • buckets_path 파라미터를 사용해 참조할 집계의 정로를 지정
  • 모든 집계가 완료된 후에 생성된 버킷을 사용
    • 하위 집계를 가질수는 없음
    • 다른 집계를 통해 생성된 버킷을 사용해 또 다른 집계를 수행

5.4.1 형제 집계

  • 동일 선상의 위치에서 수행되는 새 집계를 의미
  • 형제 집계
    • 평균 버킷 집계
    • 최대 버킷 집계
    • 최소 비킷 집계
    • 합계 버킷 집계
    • 통계 버킷 집계
    • 확장 통계 버킷 집계
    • 백분위수 버킷 집계
    • 이동 평균 집계
  • 최대 버킷 집계를 통해 분 단위 데이터량 합산과 가장 큰 데이터량을 집계
  • GET /apache-web-log/_search?size=0 { "aggs": { "histo": { // 웹 로그 분단위 집계 "date_histogram": { "field": "timestamp", "interval": "minute" }, "aggs": { // 분 단위 데이터량의 합계 "bytes_sum": { "sum": { "field": "bytes" } } } }, "max_bytes": { // 파이프라인 집계 "max_bucket": { // 합산된 데이터량 가운데 가장 큰 값을 구하기 위해 max_bucket 사용 "buckets_path": "histo>bytes_sum" // 참조할 버킷으로 histo 버킷의 bytes_sum 참조 } } } }
  • 다양한 버킷 집계 사용 방법은 p.263 참고

5.4.2 부모 집계

  • 집계를 통해 생성된 버킷을 사용해 계산을 수행 후 기존 집계에 반영
  • 부모 집계
    • 파생 집계
    • 누적 집계
    • 버킷 스크립트 집계
    • 버킷 셀렉터 집계
    • 시계열 차분 집계

파생 집계

  • 파생 집계는 부모 히스토그램 또는 날짜 히스토그램 집계에 지정된 메트릭의 파생 값을 계산하는 상위 파이프라인 집계
  • 선행되는 데이터가 존재하지 않으면 집계를 수행할 수 없음
  • 데이터가 존재하지 않는 부분이 발생할 수 있다.
    • 어느 하나의 버킷 안으로 포함되는 문서들에 요청된 필드가 포함되지 않은 경우
    • 하나 이상의 버킷에 대한 쿼리와 일치하는 문서가 존재하지 않는 경우
    • 다른 종속된 버킷에 값이 누락되어 계산된 메트릭이 값을 생성할 수 없는 경우
  • 이런 경우 갭 정책(gap_policy)을 선택할 수 있다
    • skip
      • 누락된 데이터를 버킷이 존재하지 않는 것으로 간주
      • 버킷을 건너뛰고 다름으로 사용 가능한 값을 사용해 계산을 계속 수행
    • insert_zeros
      • 누락된 값을 0으로 대채하여 파이프라인 집계 계산은 정상적으로 진행
  • 파생 집계 사용
  • GET /apache-web-log/_search?size=0 { "aggs": { "histo": { // 부모 히스토그램, 일 단위로 집계 "date_histogram": { "field": "timestamp", "interval": "day" }, "aggs": { "bytes_sum": { // 일 단위 데이이터 크기를 합산하는 집계 "sum": { "field": "bytes" } }, "sum_deriv": { // 일 단위로 데이터 크기의 합산된 값을 버킷의 현재 값과 이전 값을 비교하는 집계 수행 "derivative": { "buckets_path": "bytes_sum" } } } } } }

5.5 근삿값(Approximate)으로 제공되는 집계 연산

  • 일부 집계 연산의 경우 성능 문제로 근삿값(Approximate Count)를 기반으로 한 결과를 제공
  • 어떠한 집계 연산이 근삿값을 제공하는지 명확히 알지 못하면 큰 낭패를 볼 수 있다

5.5.1 집계 연산과 정확도

  • 수학적인 계산을 수행하는 것은 메트릭 집계 분이다.

일반적인 계산을 위한 집계 연산

  • 평균 집계
    • 문서에서 추출한 숫자값의 평균을 계산하는 메트릭 집계
  • 카디널리티 집계
    • 문서의 특정 필드에 대한 Unique 연산을 근사값으로 계산하는 메트릭 집계
    • 성능 문제로 내부적으로 hyperLogLog++알고리즘을 이용한 근삿값으로 계산(95% 수준)
    • 정확도를 위해 precision_threshold 옵션 제공
  • 최대값 집계
    • 문서에서 추출한 최대값을 계산하는 메트릭 집계
  • 최솟값 집계
    • 문서에서 추출한 최소값을 계산하는 메트릭 집계
  • 합계 집계
    • 문서에서 추출한 숫자값의 합계를 계산하는 메트릭 집계

고차원 계산을 위한 집계 연산

  • 지형 경계 집계
    • geo_point 타입의 필드를 기반으로 경계 값을 계산하는 메트릭 집계
  • 지형 중심 집계
    • geo_point 타입의 필드를 기반으로 중앙 값을 계산하는 메트릭 집계
  • 백분위 수 집계
    • 문서에서 추출한 숫자 값의 백분위 수를 계산하는 메트릭 집계
    • 성능 문제로 내부적으로 T-Digest 알고리즘을 이용해 근삿값으로 계산
    • 버킷의 양이 적을수록 100%의 정확도를 제공
  • 백분위 수 랭크 집계
    • 백분위 수 랭킹을 계산하는 메트릭 집계
    • 백분위 수 집계와 마찬가지로 근삿값으로 계산

특수한 목적을 위한 집계 연산

  • 통계 집계
    • 문서의 각종 통계 지표를 한번에 계산하는 메트릭 집계
  • 확장 통계 집계
    • 문서의 각종 통계 지표를 한번에 계산하는 확장된 메트릭 집계
  • 탑 히트 집계
    • 전체 문서 중 가장 관련성이 높은 문서만을 대상으로 하는 메트릭 집계
  • 스크립트 메트릭 집계
    • 스크립트만을 이용한 메트릭 집계
  • 추출값 카운트 집계
    • 집계되는 결과의 카운트를 설정하는 메트릭 집계

카디널리티 집계

  • 집계 연산 시 중복 제거를 위해 자주 사용하는 연산
  • 특성상 카디널리티 집계 결과가 근삿값으로 제공되기 때문에 사용할 때 주의 해야 함

5.5.2 분산 환경에서 집계 연산의 어려움

  • Aggregation API는 버킷 기반의 집계 기능을 독자적으로 구현
    • 대용량 데이터에 대한 집계 연산을 빠르게 처리 가능
    • 샤드 내에서 1차적으로 집계 작업 수행 후 중간 결과를 모두 취합해 최종 결과를 제공
  • 분산된 노드가 모두 연산을 수행하기 때문에 맵리듀스(MapReduce)와 비슷하게 동작
  • 대용량 데이터라도 다수의 샤드에 적절히 분산되어 있다면 빠르고 정확한 결과를 제공

대표적인 5가지 집계 연산이 내부적으로 동작하는 방법

  • p.273 참고
  • 분산 환경에서는 이론상 데이터의 크기가 무한대로 늘어날 수 있음
  • 분산 환경에서 복잡한 연산을 수행하기 위해서는 성능이나 메모리 사용량 등 고려할 사항이 많음
  • 분산 환경, 정확도, 실시간 세가지 요소 중 하나는 대부분 포기해야 함
    • 분산 환경을 포기하는 경우
      • 정확한 데이터를 실시간으로 제공할 수 있다.
      • 단일 서버로 서비스를 구성하고 모든 데이터를 메모리에서 처리
      • 처리 가능한 데이터의 크기에 제한이 있다.
      • 복잡한 연산을 수행 할 때 정확하고 빠르게 처리할 수 있다.
    • 실시간을 포기하는 경우
      • 분산 환경에서 정확한 데이터를 제공할 수 있다.
      • 디스크 기반의 분산 환경으로 서비스를 구성
      • 데이터의 크기에 제한이 없고 대용량 데이터를 처리할 수 있다.
      • 복잡한 연산을 수행할 때 정확하게 처리할 수 있지만 처리 시간이 오래 걸린다.
    • 정확도를 포기하는 경우
      • 분산 환경에서 데이터를 실시간으로 제공할 수 있다.
      • 메모리 기반의 분산 환경으로 서비스를 구성
      • 데이터의 크기에 제한이 없고 대용량 데이터를 처리할 수 있다.
      • 복잡한 연산을 수행할 때 근사치를 계산해서 바르게 처리할 수 있다.
  • 엘라스틱서치는 정확도를 포기하는 방식으로 분산 환경에서 복잡한 연산을 처리
    • 대부분의 집계 연산은 100% 정확한 결과를 제공
    • 클러스터 구조상 카디널리티 집계 같은 특수한 연산에 한해 제한적으로 근사값을 제공
728x90

'검색엔진 스터디' 카테고리의 다른 글

07장 한글 검색 확장 기능  (1) 2023.11.08
04장 데이터 검색  (1) 2023.11.08
03장 데이터 모델링  (1) 2023.11.08
02장 엘라스틱서치 살펴보기  (4) 2023.11.08
01장 검색 시스템 이해하기  (0) 2023.11.08