Aggregations
Query/Filter trả lời câu hỏi "Ai?" (Documents nào khớp?), thì Aggregations trả lời câu hỏi "Như thế nào?" (Thống kê, xu hướng, phân bố dữ liệu ra sao?).
Đối với một Senior Backend Engineer, hãy hình dung Aggregations giống như mệnh đề GROUP BY kết hợp với các hàm SUM, AVG, COUNT trong SQL, nhưng chạy trên kiến trúc phân tán và tốc độ thời gian thực (Real-time).
Dưới đây là kiến thức cốt lõi về cơ chế và cách sử dụng Aggregations hiệu quả.
1. Kiến trúc: Buckets & Metrics
Aggregations được chia thành 2 loại chính, thường được lồng nhau (nested) để tạo ra các báo cáo phức tạp:
A. Buckets (Thùng chứa) - Tương đương GROUP BY
Nhiệm vụ: Chia documents thành các nhóm (buckets) dựa trên tiêu chí nào đó.
Terms Aggregation: Group theo giá trị cụ thể (VD: Group theo
category_id,status).Date Histogram: Group theo khoảng thời gian (VD: Số lượng log mỗi phút, doanh thu mỗi ngày).
Range: Group theo khoảng giá trị (VD: Giá từ 0-100, 100-500, >500).
B. Metrics (Chỉ số) - Tương đương COUNT, SUM, AVG...
Nhiệm vụ: Tính toán con số thống kê bên trong mỗi bucket.
Avg, Sum, Min, Max: Tính toán cơ bản.
Cardinality: Đếm số lượng phần tử duy nhất (Count Distinct) - Lưu ý: đây là thuật toán gần đúng (approximate) sử dụng HyperLogLog++.
Percentiles: Tìm phân vị (VD: P95, P99 latency của API).
2. Deep Dive: Tại sao Aggregations lại nhanh? (Doc Values)
Đây là phần kỹ thuật quan trọng nhất.
Bạn đã biết Inverted Index rất giỏi trong việc tìm kiếm (Term A -> Doc 1, Doc 2), nhưng nó rất dở trong việc thống kê (Doc 1 -> Có những giá trị gì?). Để aggregate dùng Inverted Index, ES sẽ phải nhảy (random access) lung tung trên đĩa để lấy giá trị, rất chậm.
Elasticsearch giải quyết vấn đề này bằng một cấu trúc dữ liệu song song gọi là Doc Values.
Cấu trúc: Doc Values là cấu trúc lưu trữ dạng cột (Columnar Store), tương tự như Apache Cassandra hay HBase.
Cơ chế: Nó lưu map ngược lại:
Doc ID -> Values.Doc 1:
category: "A", price: 100Doc 2:
category: "B", price: 200
Hiệu năng: Vì dữ liệu của một trường (cột) được lưu liên tiếp nhau trên đĩa, việc load lên RAM và tính toán (SUM, AVG) cực kỳ nhanh và tận dụng tốt CPU cache.
Lưu ý: Doc Values được tạo mặc định cho tất cả các field trừ
text.
3. Ví dụ thực tế: E-commerce Dashboard
Bài toán: "Cho tôi biết doanh thu trung bình (Average Price) của từng danh mục sản phẩm trong tháng này, chỉ tính các sản phẩm đang 'active'."
Đây là Query DSL thể hiện sức mạnh của sự kết hợp Query + Aggs:
JSON
4. Vấn đề nan giải: Fielddata (Tại sao không Aggregate trên Text?)
Fielddata (Tại sao không Aggregate trên Text?)Một lỗi kinh điển khi mới làm việc với ES:
Error: Fielddata is disabled on text fields by default.
Lý do:
Field
text(ví dụ: mô tả sản phẩm) bị phân tích thành nhiều từ nhỏ (tokens).Doc Values không hỗ trợ field
text.Để aggregate trên
text, ES phải load toàn bộ Inverted Index vào bộ nhớ Heap (gọi là Fielddata). Việc này ngốn RAM khủng khiếp và có thể gây OOM (Out Of Memory) làm sập node.
Giải pháp của Senior Engineer:
Luôn sử dụng Multi-fields trong Mapping.
description: typetext-> Dùng để searchmatch.description.keyword: typekeyword-> Có Doc Values, dùng đểterms aggregation.
5. Pipeline Aggregations (Analytics nâng cao)
ES không chỉ dừng lại ở SUM/AVG. Nó cho phép lấy output của aggregation này làm input cho aggregation khác.
Ví dụ: Derivative (Đạo hàm) - Để tính tốc độ tăng trưởng.
Tạo bucket
Date Histogram(Doanh thu theo ngày).Tính
Sumdoanh thu mỗi ngày.Dùng
Derivative Pipeline Aggregationđể tính sự thay đổi doanh thu so với ngày hôm trước (Delta).
Điều này biến Elasticsearch thành một công cụ Time Series Database (TSDB) cực mạnh cho Monitoring và Observability (như cách ELK Stack dùng để vẽ biểu đồ log).
Last updated