통계 집계
통계 집계 (Stats aggregation)
stats 집계는 숫자 데이터의 요약을 계산하는 다중 값(multi-value) 메트릭 집계예요. 이 집계는 숫자 필드의 분포를 빠르게 파악하는 데 유용해요. 필드에 직접 연산할 수도 있고, 값을 파생하기 위해 스크립트를 적용할 수도 있으며, 필드가 없는 문서를 처리할 수도 있어요. stats 집계는 다섯 가지 값을 반환해요:
count: 수집된 값의 개수min: 가장 낮은 값max: 가장 높은 값sum: 모든 값의 합계avg: 값의 평균(합계를 개수로 나눈 값)
출처: 문서
본문
파라미터
stats 집계는 다음과 같은 선택 파라미터를 받아요.
| 파라미터 | 데이터 타입 | 설명 |
|---|---|---|
field |
String | 집계할 필드예요. 숫자 필드여야 해요. |
script |
Object | 집계할 사용자 지정 값을 계산하는 데 사용하는 스크립트예요. field 대신 또는 field와 함께 사용할 수 있어요. |
missing |
Number | 대상 필드가 없는 문서에 사용할 기본값이에요. |
예제
다음 예제는 전력 사용량에 대한 stats 집계를 계산해요.
power_usage라는 인덱스를 생성하고, 특정 시간에 소비된 킬로와트시(kWh) 수를 포함하는 문서를 추가해요:
PUT /power_usage/_bulk?refresh=true
{"index": {}}
{"device_id": "A1", "kwh": 1.2}
{"index": {}}
{"device_id": "A2", "kwh": 0.7}
{"index": {}}
{"device_id": "A3", "kwh": 1.5}
모든 문서의 kwh 필드에 대한 통계를 계산하려면 kwh 필드를 대상으로 consumption_stats라는 stats 집계를 사용해요. size를 0으로 설정하면 문서 히트(hits)가 반환되지 않도록 지정하게 돼요:
GET /power_usage/_search
{
"size": 0,
"aggs": {
"consumption_stats": {
"stats": {
"field": "kwh"
}
}
}
}
응답에는 인덱스의 세 문서에 대한 count, min, max, avg, sum 값이 포함돼요:
{
...
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"consumption_stats": {
"count": 3,
"min": 0.699999988079071,
"max": 1.5,
"avg": 1.1333333452542622,
"sum": 3.400000035762787
}
}
}
버킷별로 stats 집계 실행하기 (Running a stats aggregation per bucket)
device_id 필드의 terms 집계 안에 stats 집계를 중첩하면 각 기기에 대해 별도의 통계를 계산할 수 있어요. terms 집계는 고유한 device_id 값을 기준으로 문서를 버킷으로 그룹화하고, stats 집계는 각 버킷 내에서 요약 통계를 계산해요:
GET /power_usage/_search
{
"size": 0,
"aggs": {
"per_device": {
"terms": {
"field": "device_id.keyword"
},
"aggs": {
"device_usage_stats": {
"stats": {
"field": "kwh"
}
}
}
}
}
}
응답은 각 device_id에 대해 하나의 버킷을 반환하며, 각 버킷 내에서 계산된 count, min, max, avg, sum 필드가 포함돼요:
{
...
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"per_device": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "A1",
"doc_count": 1,
"device_usage_stats": {
"count": 1,
"min": 1.2000000476837158,
"max": 1.2000000476837158,
"avg": 1.2000000476837158,
"sum": 1.2000000476837158
}
},
{
"key": "A2",
"doc_count": 1,
"device_usage_stats": {
"count": 1,
"min": 0.699999988079071,
"max": 0.699999988079071,
"avg": 0.699999988079071,
"sum": 0.699999988079071
}
},
{
"key": "A3",
"doc_count": 1,
"device_usage_stats": {
"count": 1,
"min": 1.5,
"max": 1.5,
"avg": 1.5,
"sum": 1.5
}
}
]
}
}
}
이렇게 하면 단일 쿼리로 여러 기기 간 사용 통계를 비교할 수 있어요.
스크립트를 사용해 파생 값 계산하기 (Using a script to compute derived values)
stats 집계에서 사용할 값을 계산하도록 스크립트를 사용할 수도 있어요. 메트릭이 문서 필드에서 파생되거나 변환이 필요한 경우에 유용해요.
예를 들어, stats 집계를 실행하기 전에 킬로와트시(kWh)를 와트시(Wh)로 변환하려면, 1kWh가 1,000Wh이므로 각 값에 1,000을 곱하는 스크립트를 사용할 수 있어요. 다음 스크립트 doc['kwh'].value * 1000은 각 문서의 입력 값을 파생하는 데 사용돼요:
GET /power_usage/_search
{
"size": 0,
"aggs": {
"usage_wh_stats": {
"stats": {
"script": {
"source": "doc['kwh'].value * 1000"
}
}
}
}
}
응답에 반환된 stats 집계는 1200, 700, 1500 Wh 값을 반영해요:
{
...
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"usage_wh_stats": {
"count": 3,
"min": 699.999988079071,
"max": 1500,
"avg": 1133.3333452542622,
"sum": 3400.000035762787
}
}
}
필드와 함께 값 스크립트 사용하기 (Using a value script with a field)
필드를 변환과 결합할 때 field와 script를 함께 지정할 수 있어요. 이렇게 하면 스크립트 내에서 _value 변수를 사용해 필드의 값을 참조할 수 있어요.
다음 예제는 stats 집계를 계산하기 전에 각 에너지 판독값을 5% 증가시켜요:
GET /power_usage/_search
{
"size": 0,
"aggs": {
"adjusted_usage": {
"stats": {
"field": "kwh",
"script": {
"source": "_value * 1.05"
}
}
}
}
}
누락 값 처리 (Missing values)
일부 문서에 대상 필드가 없으면 기본적으로 집계에서 제외돼요. 기본값을 사용해 해당 문서를 포함하려면 missing 파라미터를 지정할 수 있어요.
다음 요청은 누락된 kwh 값을 0.0으로 처리해요:
GET /power_usage/_search
{
"size": 0,
"aggs": {
"consumption_with_default": {
"stats": {
"field": "kwh",
"missing": 0.0
}
}
}
}