DB에서 집계를 처리할 때, SQL에서는 GROUP BY문을 사용해 데이터를 그룹화하고, 각 그룹에 대해 집계 함수 (COUNT, AVG, SUM 등)을 적용합니다. 이는 매우 직관적이고 유용하지만, 대용량 데이터에서 효율적인 집계를 위한 최적화가 필요한 경우가 많습니다. 그렇다면 Elasticsearch에서는 어떻게 집계를 할까요? 🤔
Elasticsearch는 검색 엔진이라 SQL처럼 전통적인 관계형 데이터베이스 방식의 집계 방식이 아닌, 분산 검색 시스템 특성을 반영한 집계 방식을 제공합니다.
Elasticsearch의 집계는 데이터를 분석하고 요약하는 데 필요한 기능을 제공합니다. 이는 SQL의 GROUP BY와 유사하지만, Elasticsearch에서는 더 많은 기능과 유연성을 제공하여 대규모 데이터에서 빠르고 효율적인 집계가 가능하죠. 일반적으로 버킷 집계(Bucket Aggregation)와 메트릭 집계(Metric Aggregation)로 나뉩니다.
버킷 집계 (Bucket Aggregation)
버킷 집계는 데이터를 특정 기준에 따라 "그룹화"하는 방식입니다. 이 집계는 데이터를 "버킷"이라는 그룹으로 묶고, 각 버킷에 대해서 별도의 집계를 적용할 수 있습니다. 버킷은 도큐먼트가 분할되는 단위로 나뉜 각 그룹을 의미합니다. 버킷 집계는 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 집계를 활용하여 실시간 분석이나 대규모 데이터 집계를 간편하게 수행할 수 있습니다.
'DevOps > Elastic Stack' 카테고리의 다른 글
[Elasticsearch] Cardinality 집계, 유니크한 값의 수 - 컴도리돌이 (2) | 2024.12.23 |
---|---|
[Elasticsearch] Elasticsearch Highlight를 활용한 필드 매칭 이해하기 - 컴도리돌이(feat. java) - 컴도리돌이 (0) | 2024.12.22 |
[Elasticsearch] 성능 향상을 위한 doc_values 사용법: 메모리 효율 향상시키기 - 컴도리돌이 (3) | 2024.11.09 |
[Elasticsearch] 성능 개선을 위한 코드 비교 및 분석 - 컴도리돌이 (4) | 2024.11.08 |
[Elasticsearch] wildcard 쿼리에 대해 제대로 이해하기 - 컴도리돌이 (0) | 2024.11.07 |