728x90
특정 필드에 대하여 합이나 평균을 계산하거나, 다른 집계와 중첩해서 결과에 대해 특정 필드의 _score 값에 따라 정렬을 수행하거나, 지리 정보를 통해 범위 계산을 하는 등 다양한 집계를 수행할 수 있다. 일반적으로 필드 데이터를 사용해 집계가 이뤄지지만 스크립트를 사용해 집계를 수행할 수도 있다. 단일 숫자 집계는 집계를 수행한 결괏값이 하나라는 의미로 sum, avg가 속하며, 다중 숫자 메트릭 집계 같은 경우 집계를 수행한 결괏값이 여러 개가 될 수 있으며, Stats나 geo_bounds가 이에 속한다.
Request
GET /<인덱스명>/_search?size=0
{
"aggs": {
"<집계이름>": {
"<집계타입>": {
"field": "<필드명>"
}
}
}
}
- size: 집계된 문서들의 데이터는 불필요하므로 Size 값을 0으로 지정해 반환 받지 않는다.
- aggs: 집계를 수행한다(aggregation도 가능)
- 집계 이름: 집계에 대한 이름으로 하위 쿼리, 여러 쿼리를 함께 사용할 때 구별하는 용도로 사용한다.
- 집계 타입: 합계, 평균, 시계열 등 집계 타입을 명시한다.
- fields: 집계의 대상이 되는 필드를 명시한다.
Response
{
"took": 1, // 검색/집계 수행 시간 (ms)
"timed_out": false, // 타임아웃 여부
"_shards": {
"total": 5, // 전체 샤드 수
"successful": 5, // 성공한 샤드 수
"skipped": 0, // 스킵된 샤드 수
"failed": 0 // 실패한 샤드 수
},
"hits": {
"total": 200, // 검색된 전체 문서 개수
"max_score": 0, // 스코어(집계만 했으니 0)
"hits": [] // 검색 결과 (size=0이면 비어 있음)
},
"aggregations": {
"<집계이름>": {
<집계결과>
}
}
}
- took: 엘라스틱서치가 검색을 실행하는데 소요한 시간(ms)
- timed_out: 검색 시간 초과 여부
- _shard:검색에 영향받는 샤드 정보
- total: 검색에 영행받는 샤드 총 개수
- success: 검색 요청에 대한 처리를 정상 수행한 샤드 수
- skipped: 검색 요청에 대한 처리를 건너뛴 샤드 수
- failed: 검색 요청에 대한 처리를 실패한 샤드 수
- hits: 검색 결과
- total: 검색 기준과 일치하는 총 문서 수
- max_score: 검색 결과에 포함된 문서의 최대 스코어 값
- hits: 검색 문서들의 배열(기본 10개)
- aggregations: 집계 결과
- 집계 이름: 검색을 요청할 때 지정한 집계의 이름
- 집계 결과: 검색을 요청할 때 지정한 집계 타입에 따른 결과
합산 집계
GET /apache-web-log/_search?size=0
{
"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": {
"lang": "painless",
"source": "doc['bytes'].value / (double)params.divide_value",
"params": {
"divide_value": 1000
}
}
}
}
}
}
- 단일 숫자 메트릭 집계로, 해당 서버로 총 얼마큼에 데이터가 유입되었는지 볼 수 있다.
- Script를 사용하면, 집계되는 데이터를 원하는 단위로 변경 가능하다.
- script: 스크립트 컨택스트를 의미하며, 6.x 이후부터 Groovy가 아닌 Painless를 기본 언어로 사용한다.
- divide_value(1000) 값으로 나눈 값을 반환한다
평균 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"avg_bytes": {
"avg": {
"field": "bytes"
}
}
}
}
- 단일 숫자 메트릭 집계로, 해당 서버로 유입된 데이터의 평균값을 쉽게 구할 수 있다.
최솟값 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"min_bytes": {
"min": {
"field": "bytes"
}
}
}
}
- 단일 숫자 메트릭 집계로, 서버로 유입된 데이터 중 최솟값을 구할 수 있다.
최댓값 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"max_bytes": {
"max": {
"field": "bytes"
}
}
}
}
- 단일 숫자 메트릭 집계로, 서버로 유입된 데이터 중 가장 큰 값을 구할 수 있다.
개수 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"bytes_count": {
"value_count": {
"field": "bytes"
}
}
}
}
- 단일 숫자 메트릭 집계로 해당 서버로 사용자 요청이 몇 회 유입됐는지 알 수 있다.
통계 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"bytes_stats": {
"stats": {
"field": "bytes"
}
}
}
}
- 결괏값이 여러 개인 다중 숫자 집계에 해당되며, 합/평균/최대/최소/개수를 한번에 쿼리로 집계할 수 있다.
확장 통계 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"bytes_extended_stats": {
"extended_stats": {
"field": "bytes"
}
}
}
}
Response
{
"bytes_extended_stats": {
"count": 9330,
"min": 35,
"max": 69192717,
"avg": 294456.8601286174,
"sum": 2747282505,
"sum_of_squares": 118280314234513340,
"variance": 12590713617814.016,
"std_deviation": 3548339.5578515334,
"std_deviation_bounds": {
"upper": 7391135.9758316846,
"lower": -6802222.25557445
}
}
}
- 결과값이 여러 개인 다중 숫자 메트릭 집계에 해당하며, 통계 집계 + 표준 편차 같은 통계값을 구할 수 있다.
- response
- sum_of_squares: 제곱합, 변동의 측정이나 평균의 편차를 나타낸다.
- variance: 확률 변수의 분산, 확률 변수가 기댓값으로부터 얼마나 떨어진 곳에 분포하는지를 가늠하는 숫자
- std_deviation: 표준 편차, 자료의 산포도를 나타내는 수치로 분산의 양의 제곱근으로 정의
- std_deviation_bounds: 표준편차의 범위를 의미
- upper: 표준편차의 상한 값을 의미
- lower: 표준편차의 하한 값을 의미
카디널리티 집계
GET /apache-web-log/_search?size=0
{
"query": {
"constant_score": {
"filter": {
"match": {
"geoip.country_name": "United States"
}
}
}
},
"aggs": {
"us_cardinality": {
"cardinality": {
"field": "geoip.city_name.keyword"
}
}
}
}
- 단일 숫자 메트릭 집계로, 개수 집합과 유사하게 횟수를 계산하지만 중복된 값을 제외한 고유한 값에 대한 집계를 수행한다.
- 모든 문서에 대해 중복된 값을 집계하는 것은 성능에 큰 영향을 주므로 근사치를 통해 집계를 수행한다.
- 카디널리티 집계는 대상 필드를 고유한 값으로 근사치를 계산한 메트릭 집계록 데이터가 적을 경우 거의 정확하지만, 차이가 날 수도 있다.
참고
근사치 계산: 카디널리티 집계는 HyperLogLog++ 알고리즘을 기반으로 동작(해시 기반)
- 정확성을 위해 메모리를 교환하는 방법을 결정(정확도를 높일수록 더 많은 메모리 필요)
- 카디널리티가 낮은 집합일수록 더 뛰어난 정확성을 보임
- 수십억 개의 고윳값이 존재하더라도 메모리 사용은 정확도 설정에 의존해서 고정된 메모리를 사용한다.
정확도는 precision_threshold 속성으로 설정하며, 0-40000 값으로 설정 가능하며 카디널리티가 precision 보다 적으로 경우 100%의 정확도를 보인다. -> 메모리 사용률이 precision_theshold * 8 바이트로 워크로드에 따라 적절한 수치를 지정하며 해시값을 미리 계산해 두면 성능 향상에 도움이 된다.(murmur3 알고리즘을 사용되는데, 플러그인 설치 필요)
백분위 수 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"bytes_percentiles": {
"percentiles": {
"field": "bytes",
//"percents": [10, 20, 30, 40, 50, 60, 70, 80, 90] //지정하지 않았을 경우 알아서 지정된다.
}
}
}
}
- 다중 숫자 메트릭 집계로, 크기가 있는 값들로 이뤄진 자료를 순서대로 나열했을 때을 백분율로 나타낼 수 있다.
- 서버 사양보다 더 큰 데이터가 유입된다면 데이터 크기를 조절해서 서비스 품질을 개선할 수 있다.
- 백분위 수 집계는 근사치 계산으로 집계가 되며, 문서의 집합에서 특정 필드에 대한 백분위 수를 구해야 하기 때문에 TDigest 알고리즘을 사용한다.
- 문서들의 집합 크기가 작을수록 정확도는 높고, 클수록 근사치 계산을 한다.
- 큰 크기의 데이터를 계산할 때는 메모리를 많이 사용하기 때문에 효과적으로 계산하기 위해 근사치 계산을 한다.
- Compression을 통해 메모리 사용량과 정확도 사이의 값을 설정할 수 있으며 값이 클수록 데이터 구조가 커져 메모리 사용량이 높아지고, 속도가 느려지지만 정확한 결과를 얻을 수 있다.
참고
TDigest 알고리즘: 백분위 수의 근사치를 계산하기 위해 노드를 사용(노드가 많아질수록 정확도가 증가)
Compression은 노드 수를 제한하기 위한 것으로 메모리 사용량은 20 * 노드 크기 * compression으로 계산한다.
노드는 약 32 바이트의 메모리를 사용하며, 기본 Compression 값으로 최악 64KB 크기의 TDigest를 생성한다.
백분위 수 랭크 집계
GET /apache-web-log/_search?size=0
{
"aggs": {
"bytes_percentile_ranks": {
"percentile_ranks": {
"field": "bytes",
"values": [5000, 10000]
}
}
}
}
- 다중 숫자 메트릭 집계로, 특정 필드 수치를 통해 백분위의 어느 구간에 속해있는지 확인할 수 있다
지형 경계 집계
Request
GET /apache-web-log-applied-mapping/_search?size=0
{
"query": {
"constant_score": {
"filter": {
"match": {
"geoip.continent_code": "EU" //유럽 국가만
}
}
}
},
"aggs": {
"viewport": {
"geo_bounds": {
"field": "geoip.location",
"wrap_longitude": true
}
}
}
}
- 지형 좌표를 포함하고 있는 필드에 해당 지역 경계 상자를 계산하는 메트릭 집계이다.
- 필드 타입은 geo_point 타입이어야 한다.
- 경계 집계로 수집된 데이터 범위 중 가장 끝부분에 위치한 정보로 경계가 정해지기 때문에 넓은 범위의 위도, 경도 좌표로 지정된다.
- 위도, 경도는 수치만 봐서 짐작하기 힘들기 때문에 키바나에서 좌표 정보를 시각화해서 제공한다.
지형 중심 집계
GET /apache-web-log-applied-mapping/_search?size=0
{
"aggs": {
"centroid": {
"geo_centroid": {
"field": "geoip.location"
}
}
}
}
- 지형 경계 집계의 범위에서 정가운데의 위치를 반환한다.
728x90
'Elastic Search' 카테고리의 다른 글
| Ch05. 데이터 집계 - 파이프라인 집계 (0) | 2025.09.18 |
|---|---|
| Ch05. 데이터 집계 - 버킷 집계 (0) | 2025.09.18 |
| Ch05. 데이터 집계 - 집계 (0) | 2025.09.18 |
| Ch04. 데이터 검색 - 부가적인 검색 API (0) | 2025.09.14 |
| Ch04. 데이터 검색 - Query DSL의 주요 쿼리 (0) | 2025.09.14 |