Elasticsearch Aggregations, 집계
Elasticsearch 는 검색뿐 아니라 여러가지 연산을 할 수 있는 Aggregation 기능이 있다. Kibana에서 차트, 그래프 등으로 시각화시킬 때 사용하는 기능이 aggregation 이다.
aggregations 에는 두 가지 종류가 있다.
- Metrics aggregation : 숫자 또는 날짜 필드의 값으로 계산함
- Bucket aggregation : 범위나 keyword 값으로 그룹화함
그리고 확장하여 사용할 수 있는 aggregations 도 있다.
- Sub-aggregation : bucket 하위 집계
- Pipeline-aggregation : metrics aggregation 결과로 다시 집계
이 포스팅에서는 집계 마지막 글인 Pipeline-aggregation 에 대한 개념 설명 및 실습 예제를 다룬다.
** 아래 실습에서 사용된 도큐먼트 데이터 입력은 metrics aggregations 참조
Pipeline-Aggregation
sub-aggregation이 버킷 안에서 다시 버킷을 만들거나 집계를 하는 것이었다면 pipieline-aggregation은 버킷 결과들을 다시 연산하여 새로게 입력하는 방법이다. metrics에서 사용한 min, max, avg, sum, stats 등과 비슷하게 다른 버킷의 결과들을 min_bucket, max_bucket, avg_bucket, sum_bucket, stats_bucket, moving_avg(이동 평균을 구하는), derivative(미분값을 구하는), cumulative_sum(값의 누적 합을 구하는) 등이 있다.
stations 인덱스에서 date_histogram을 사용하여 month 월별로 나눈 passangers의 합을 다시 cumulative_sum을 이용해 누적값을 구하기 (date_histogram 등의 사용 설명 및 예제는 Bucket aggregation참고)
GET stations/_search
{
"size": 0,
"aggs": {
"bucket_monthly": {
"date_histogram": {
"field": "date",
"interval": "month"
},
"aggs": {
"sum_psg": {
"sum": {
"field": "passangers"
}
},
"acc_sum_psg": {
"cumulative_sum": {
"buckets_path": "sum_psg"
}
}
}
}
}
}
먼저 첫 번째 aggs에서 monthly 로 나눈 버킷을 date_histogram을 사용해서 나눠준 후 그 안에 다시 두 번째 aggs를 넣어 sum_psg(각 월별 총 승객 수)와 acc_sum_psg (각 월별 총 승객 수의 누적 합)을 설정해 주었다.
결과 :
"aggregations" : {
"bucket_monthly" : {
"buckets" : [
{
"key_as_string" : "2022-12-01T00:00:00.000Z",
"key" : 1669852800000,
"doc_count" : 4,
"sum_psg" : {
"value" : 5000.0
},
"acc_sum_psg" : {
"value" : 5000.0
}
},
{
"key_as_string" : "2023-01-01T00:00:00.000Z",
"key" : 1672531200000,
"doc_count" : 1,
"sum_psg" : {
"value" : 2000.0
},
"acc_sum_psg" : {
"value" : 7000.0
}
},
{
"key_as_string" : "2023-02-01T00:00:00.000Z",
"key" : 1675209600000,
"doc_count" : 1,
"sum_psg" : {
"value" : 2000.0
},
"acc_sum_psg" : {
"value" : 9000.0
}
},
{
"key_as_string" : "2023-03-01T00:00:00.000Z",
"key" : 1677628800000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
},
"acc_sum_psg" : {
"value" : 9000.0
}
},
{
"key_as_string" : "2023-04-01T00:00:00.000Z",
"key" : 1680307200000,
"doc_count" : 1,
"sum_psg" : {
"value" : 2000.0
},
"acc_sum_psg" : {
"value" : 11000.0
}
},
{
"key_as_string" : "2023-05-01T00:00:00.000Z",
"key" : 1682899200000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
},
"acc_sum_psg" : {
"value" : 11000.0
}
},
{
"key_as_string" : "2023-06-01T00:00:00.000Z",
"key" : 1685577600000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
},
"acc_sum_psg" : {
"value" : 11000.0
}
},
{
"key_as_string" : "2023-07-01T00:00:00.000Z",
"key" : 1688169600000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
},
"acc_sum_psg" : {
"value" : 11000.0
}
},
{
"key_as_string" : "2023-08-01T00:00:00.000Z",
"key" : 1690848000000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
},
"acc_sum_psg" : {
"value" : 11000.0
}
},
{
"key_as_string" : "2023-09-01T00:00:00.000Z",
"key" : 1693526400000,
"doc_count" : 1,
"sum_psg" : {
"value" : 3000.0
},
"acc_sum_psg" : {
"value" : 14000.0
}
},
{
"key_as_string" : "2023-10-01T00:00:00.000Z",
"key" : 1696118400000,
"doc_count" : 2,
"sum_psg" : {
"value" : 6000.0
},
"acc_sum_psg" : {
"value" : 20000.0
}
},
{
"key_as_string" : "2023-11-01T00:00:00.000Z",
"key" : 1698796800000,
"doc_count" : 1,
"sum_psg" : {
"value" : 3000.0
},
"acc_sum_psg" : {
"value" : 23000.0
}
},
{
"key_as_string" : "2023-12-01T00:00:00.000Z",
"key" : 1701388800000,
"doc_count" : 2,
"sum_psg" : {
"value" : 3300.0
},
"acc_sum_psg" : {
"value" : 26300.0
}
}
]
}
}
bucket_monthly라는 key 안의 bucket 배열 값으로 쭉 나열 됨
acc_sum_psg . value를 보면 각 이전 배열 값들이 계속해서 누적되어 합한 걸 알 수 있다.
서로 다른 버킷의 pipeline-aggregation
서로 다른 버킷에 있는 값들도 pipeline-aggregation으로 집계가 가능하다. 이 경우에는 ">" 이 기호를 사용해서 해당 버킷 > 목표 버킷 안의 집계 이름(사용자 정의 필드명)을 적어주면 된다.
위와 동일하게 monthly 월 별로 버킷을 생성 후, 그 안에 승객의 합계를 넣고 다른 sum 버킷을 생성하기
GET stations/_search
{
"size": 0,
"aggs": {
"bucket_monthly": {
"date_histogram": {
"field": "date",
"interval": "month"
},
"aggs": {
"sum_psg": {
"sum": {
"field": "passangers"
}
}
}
},
"bucket_sum_psg": {
"sum_bucket": {
"buckets_path": "bucket_monthly>sum_psg"
}
}
}
}
결과 :
"aggregations" : {
"bucket_monthly" : {
"buckets" : [
{
"key_as_string" : "2022-12-01T00:00:00.000Z",
"key" : 1669852800000,
"doc_count" : 4,
"sum_psg" : {
"value" : 5000.0
}
},
{
"key_as_string" : "2023-01-01T00:00:00.000Z",
"key" : 1672531200000,
"doc_count" : 1,
"sum_psg" : {
"value" : 2000.0
}
},
{
"key_as_string" : "2023-02-01T00:00:00.000Z",
"key" : 1675209600000,
"doc_count" : 1,
"sum_psg" : {
"value" : 2000.0
}
},
{
"key_as_string" : "2023-03-01T00:00:00.000Z",
"key" : 1677628800000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
}
},
{
"key_as_string" : "2023-04-01T00:00:00.000Z",
"key" : 1680307200000,
"doc_count" : 1,
"sum_psg" : {
"value" : 2000.0
}
},
{
"key_as_string" : "2023-05-01T00:00:00.000Z",
"key" : 1682899200000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
}
},
{
"key_as_string" : "2023-06-01T00:00:00.000Z",
"key" : 1685577600000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
}
},
{
"key_as_string" : "2023-07-01T00:00:00.000Z",
"key" : 1688169600000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
}
},
{
"key_as_string" : "2023-08-01T00:00:00.000Z",
"key" : 1690848000000,
"doc_count" : 0,
"sum_psg" : {
"value" : 0.0
}
},
{
"key_as_string" : "2023-09-01T00:00:00.000Z",
"key" : 1693526400000,
"doc_count" : 1,
"sum_psg" : {
"value" : 3000.0
}
},
{
"key_as_string" : "2023-10-01T00:00:00.000Z",
"key" : 1696118400000,
"doc_count" : 2,
"sum_psg" : {
"value" : 6000.0
}
},
{
"key_as_string" : "2023-11-01T00:00:00.000Z",
"key" : 1698796800000,
"doc_count" : 1,
"sum_psg" : {
"value" : 3000.0
}
},
{
"key_as_string" : "2023-12-01T00:00:00.000Z",
"key" : 1701388800000,
"doc_count" : 2,
"sum_psg" : {
"value" : 3300.0
}
}
]
},
"bucket_sum_psg" : {
"value" : 26300.0
}
}
결과도 두 개의 버킷이 생성되었다. Bucket_sum_psg는 다른 버킷이었던 bucket_monthly의 sum_psg 승객 수 합계를 모두 합한 값이다.
Reference : https://esbook.kimjmin.net/08-aggregations
'Elasticsearch' 카테고리의 다른 글
[Elasticsearch] date format 날짜 형식 정리 (0) | 2022.11.11 |
---|---|
[Elasticsearch] Aggregations 집계 총정리 (0) | 2022.11.10 |
[Elasticsearch] bucket sub-aggregation 하위 집계 (0) | 2022.11.10 |
[Elasticsearch] Bucket Aggregations 버킷 집계 정리 (0) | 2022.11.10 |
[Elasticsearch] Metrics Aggregations 집계 정리 (0) | 2022.11.10 |