안녕하세요! 이전 포스팅에서는 Elasticsearch의 집계 기능과 MySQL의 GROUP BY를 비교하는 시간을 가졌습니다. 오늘은 Elasticsearch의 date_histogram 집계에 대해 이야기해보고, 이를 MySQL의 날짜 그룹화와 비교하겠습니다.
다음의 예시 데이터셋으로 시작해봅시다.
#sales 인덱스:
[
{ "sale_id": 1, "date": "2023-01-01", "category": "Electronics", "amount": 200 },
{ "sale_id": 2, "date": "2023-01-02", "category": "Electronics", "amount": 150 },
{ "sale_id": 3, "date": "2023-01-07", "category": "Books", "amount": 20 },
{ "sale_id": 4, "date": "2023-02-01", "category": "Books", "amount": 25 },
{ "sale_id": 5, "date": "2023-02-02", "category": "Books", "amount": 30 },
{ "sale_id": 6, "date": "2023-02-07", "category": "Electronics", "amount": 300 }
]
이 데이터셋은 각각의 판매 건에 대한 정보를 담고 있습니다. 각 판매는 sale_id, date, category, amount 필드를 가지고 있습니다.
Elasticsearch에서 date_histogram 집계는 특정 시간 간격으로 날짜 필드를 버킷화하는 데 사용됩니다. 또한 bool 필터를 사용하여 특정 조건을 충족하는 문서만 대상으로 집계를 수행할 수 있습니다.
#GET /sales/_search
{
"size": 0,
"query": {
"bool": {
"filter": {
"term": { "category.keyword": "Electronics" }
}
}
},
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
}
}
}
}
이 쿼리는 category.keyword가 "Electronics"인 판매 건만을 대상으로, 월별로 판매 건을 집계합니다.
반환된 응답은 다음과 같습니다.
{
...
"aggregations": {
"sales_over_time": {
"buckets": [
{
"key_as_string": "2023-01-01",
"key": 1672444800000,
"doc_count": 2
},
{
"key_as_string": "2023-02-01",
"key": 1672531200000,
"doc_count": 1
}
]
}
}
}
이제 같은 작업을 SQL을 사용하여 수행해보겠습니다. SQL에서는 WHERE 절과 GROUP BY 절을 사용하여 동일한 결과를 얻을 수 있습니다.
SELECT DATE_FORMAT(date, '%Y-%m') as month, COUNT(*)
FROM sales
WHERE category = 'Electronics'
GROUP BY month;
이 쿼리는 'category'가 'Electronics'인 판매 건만을 대상으로, 월별로 판매 건을 집계합니다. 결과는 다음과 같습니다.
+---------+----------+
| month | COUNT(*) |
+---------+----------+
| 2023-01 | 2 |
| 2023-02 | 1 |
+---------+----------+
Elasticsearch의 date_histogram 집계와 SQL의 날짜 그룹화는 동일한 목적을 위해 사용되지만, 그 구현 방식과 사용자 인터페이스에서 차이가 있습니다. Elasticsearch는 NoSQL 데이터베이스로서, 데이터의 분포를 그래픽으로 표현하거나 시간 별로 데이터를 분류하는 등의 분석에 더 효과적입니다. 반면에, SQL은 관계형 데이터베이스로서, 정형화된 데이터와 관계를 이용한 복잡한 쿼리에 더 강점을 가지고 있습니다.
이상으로 Elasticsearch와 SQL의 날짜 집계 방식에 대해 간략하게 살펴보았습니다. 향후에는 더 복잡한 집계와 분석을 위해 Elasticsearch의 다양한 집계 기능을 활용하는 방법에 대해 알아보겠습니다. 감사합니다!