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으로 대채하여 파이프라인 집계 계산은 정상적으로 진행
- skip
- 파생 집계 사용
- 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 |