본문 바로가기

Elasticsearch

[Elasitcsearch] Pipeline-Aggregation 개념 및 예제

반응형

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

반응형