본문 바로가기

DevOps/Elastic Stack

[Elasticsearch] Elasticsearch 집계하기, 버킷 집계(Bucket Aggregation)과 메트릭 집계(Metric Aggregation) (Feat. Java) - 컴도리돌이

728x90
728x90

DB에서 집계를 처리할 때, SQL에서는 GROUP BY문을 사용해 데이터를 그룹화하고, 각 그룹에 대해 집계 함수 (COUNT, AVG, SUM 등)을 적용합니다. 이는 매우 직관적이고 유용하지만, 대용량 데이터에서 효율적인 집계를 위한 최적화가 필요한 경우가 많습니다. 그렇다면 Elasticsearch에서는 어떻게 집계를 할까요? 🤔

 

Elasticsearch는 검색 엔진이라 SQL처럼 전통적인 관계형 데이터베이스 방식의 집계 방식이 아닌, 분산 검색 시스템 특성을 반영한 집계 방식을 제공합니다. 

 

Elasticsearch의 집계는 데이터를 분석하고 요약하는 데 필요한 기능을 제공합니다. 이는 SQL의 GROUP BY와 유사하지만, Elasticsearch에서는 더 많은 기능과 유연성을 제공하여 대규모 데이터에서 빠르고 효율적인 집계가 가능하죠. 일반적으로 버킷 집계(Bucket Aggregation)와 메트릭 집계(Metric Aggregation)로 나뉩니다.

버킷 집계 (Bucket Aggregation)

https://flambeeyoga.tistory.com/entry/%EC%97%98%EB%9D%BC%EC%8A%A4%ED%8B%B1%EC%84%9C%EC%B9%98elasticsearch-%EC%A7%91%EA%B3%84

 

버킷 집계는 데이터를 특정 기준에 따라 "그룹화"하는 방식입니다. 이 집계는 데이터를 "버킷"이라는 그룹으로 묶고, 각 버킷에 대해서 별도의 집계를 적용할 수 있습니다. 버킷은 도큐먼트가 분할되는 단위로 나뉜 각 그룹을 의미합니다. 버킷 집계는 SQL의 GROUP BY와 유사한 개념이지만, Elasticsearch에서는 이를 더 복잡하고 유연하게 처리할 수 있습니다.

주요 버킷 집계 종류:

  • Terms Aggregation: 특정 필드 값에 따라 문서를 그룹화합니다. 예를 들어, 카테고리별, 사용자별 데이터를 그룹화할 때 유용합니다.
  • Range Aggregation: 숫자나 날짜 값의 범위로 문서를 그룹화합니다. 예를 들어, 가격대별 상품을 묶을 때 사용됩니다.
  • Date Histogram Aggregation: 날짜를 기준으로 데이터를 일정한 기간 단위로 그룹화합니다. 예를 들어, 하루, 주, 월 단위로 데이터를 묶을 때 유용합니다.
  • Filters Aggregation: 필터 조건을 지정하여 문서를 그룹화합니다. 예를 들어, 특정 조건을 만족하는 문서들을 그룹화할 때 사용합니다.

메트릭 집계 (Metric Aggregation)

메트릭 집계는 각 그룹 또는 전체 문서에 대해 통계적 계산을 수행합니다. count, sum, avg, min, max와 같은 집계 메서드를 통해 데이터를 요약하는 데 사용됩니다. 메트릭 집계는 집계 대상이 되는 숫자형 필드에 대한 통계 값을 계산하는 데 주로 사용됩니다.

주요 메트릭 집계 종류:

  • Sum: 주어진 필드의 모든 값의 합을 구합니다.
  • Avg: 주어진 필드의 평균 값을 계산합니다.
  • Min/Max: 주어진 필드의 최소/최대 값을 계산합니다.
  • Stats: 주어진 필드에 대한 통계(합계, 평균, 최소, 최대, 분산 등)를 한 번에 구합니다.
  • Extended Stats: 주어진 필드에 대한 추가적인 통계(표준편차, 분산 등)를 제공합니다.

Elasticsearch 집계 쿼리 예시

먼저, Elasticsearch에서 집계를 위한 데이터 샘플을 준비해야겠죠? 카테고리, 주문 금액, 주문일자 을 포함하고 있는 다음과 데이터를 준비했습니다. 

[
  { "category": "Electronics", "amount": 100, "order_date": "2024-12-01" },
  { "category": "Books", "amount": 50, "order_date": "2024-12-02" },
  { "category": "Electronics", "amount": 200, "order_date": "2024-12-02" },
  { "category": "Electronics", "amount": 150, "order_date": "2024-12-03" },
  { "category": "Clothing", "amount": 75, "order_date": "2024-12-01" }
]

 

위 데이터를 가지고 카테고리를 기준으로 각 카테고리의 총매출을 집계한다고 가정했을 때, SQL에서는 GROUP BY category와 SUM(amount)를 사용하지만, Elasticsearch에서는 집계 쿼리를 다르게 구성해야 합니다. 

{
  "size": 0,
  "aggs": {
    "category_sales": {
      "terms": {
        "field": "category.keyword"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "amount"
          }
        }
      }
    }
  }
}

 

위의 쿼리는 category.keyword를 기준으로 각 카테고리의 매출 합계를 구하는 집계입니다. 여기서 중요한 점은 terms 집계가 버킷 집계로 데이터를 카테고리별로 그룹화하고, 그 후 메트릭 집계(sum)으로 각 그룹의 매출 합계를 계산한다는 것이에요. SQL에서의 GROUP BY category와 유사한 역할을 합니다. 

 

위에 size에 0으로 설정한 이유는 없이 실행시키면 아실 거예요.😆

 

SQL의 GROUP BY는 데이터를 그룹화하고 각 그룹에 대해 집계 함수(예: SUM, COUNT)를 적용하지만, Elasticsearch에서는 집계 쿼리에서 terms 집계로 데이터를 그룹화하고, 각 그룹에 대해 추가적인 메트릭 집계(예: sum, avg)를 결합하는 방식으로 처리합니다. 이 점에서 Elasticsearch는 더 복잡한 집계를 유연하게 처리할 수 있습니다. 

자바 코드 예시

아래는 자바에서 Elasticsearch 집계 쿼리를 실행하는 예시입니다. 

 SearchRequest searchRequest = new SearchRequest.Builder()
                    .index("orders")
                    .size(0)
                    .aggregations("category_sales",
                            a -> a.terms(
                                            t -> t.field("category.keyword")
                                    )
                                    .aggregations("total_sales",
                                            agg -> agg.sum(
                                                    s -> s.field("amount")
                                            )
                                    )
                    )
                    .build();

 

이 코드는 Elasticsearch에 연결하여 orders 인덱스에서 카테고리별 총매출을 집계하는 예시예요. terms집계와 sum집계를 사용하여 각 카테고리의 매출을 구하는 방법을 보여줍니다. 

 

Elasticsearch의 집계 기능은 매우 유연하고, SQL의 GROUP BY와는 다른 방식으로 데이터를 그룹화하고 통계적인 분석을 수행할 수 있습니다. 버킷 집계는 데이터를 그룹화하고, 그 안에서 여러 메트릭 집계를 결합하여 복잡한 분석을 할 수 있게 합니다. Elasticsearch의 집계는 대규모 데이터를 효율적으로 처리할 수 있는 강력한 도구입니다. 자바 코드와 함께 Elasticsearch 집계를 활용하여 실시간 분석이나 대규모 데이터 집계를 간편하게 수행할 수 있습니다.


 

엘라스틱서치(elasticsearch) 집계

해당 글은 엘라스틱 스택 개발부터 운영까지라는 책 중 5장을 정리하여 쓴 글입니다. 엘라스틱서치도 데이터를 날짜별로 묶거나 특정 카테고리별로 묶어 그룹별 통계를 내는 집계 개념(aggregation

flambeeyoga.tistory.com

 

728x90
728x90