I. Giới thiệu
Trong các bài viết trước, chúng ta đã thảo luận về những lý do cần thiết để sử dụng Elasticsearch. Trong bài viết này, mình xin chia sẻ chi tiết về cách mình đã triển khai Elasticsearch trong các dự án thực tế. Hãy bắt đầu với chủ đề chính ngay nhé!
II. Thiết Kế Schema (Mapping)
1. Phân Tích Yêu Cầu
Để triển khai Elasticsearch một cách hiệu quả, trước tiên, cần phải hiểu rõ yêu cầu của doanh nghiệp. Mục tiêu mà mình đang hướng tới là tìm sản phẩm phù hợp với chi phí vận chuyển thấp nhất cho người tiêu dùng. Để làm được điều này, cần xác định các trường dữ liệu quan trọng như (id
, tên
, description
, price
) và thông tin liên quan đến nhà cung cấp (id
, vị trí địa lý
).
2. Cấu Trúc Document
Trong Elasticsearch, có nhiều lựa chọn cho cấu trúc dữ liệu như:
Cấu trúc phẳng (Flat structure)
: Đơn giản và dễ chỉnh sửa, mang lại hiệu suất cao.Đối tượng lồng nhau (Nested objects)
: Phù hợp cho các mảng đối tượng phức tạp.Mối quan hệ cha-con (Parent-child relationships)
: Hỗ trợ các mối quan hệ phức tạp giữa các thực thể.
Dự án của mình tương tự như một nền tảng thương mại điện tử, nơi các nhà bán hàng có thể tạo và quản lý sản phẩm, do đó cấu trúc phẳng là lựa chọn phù hợp.
json
{
"product_id": "P001_S001",
"store_id": "S001",
"store_location": {
"lat": 10.762622,
"lon": 106.660172
},
"product_name": "Smartphone X của cửa hàng A",
"product_description": "Smartphone X bản đặc biệt chỉ có tại cửa hàng A",
"price": 999.99
}
3. Kiểu Dữ Liệu
Elasticsearch hỗ trợ nhiều kiểu dữ liệu khác nhau:
Text
: phục vụ cho việc tìm kiếm toàn văn bản.Keyword
: cho việc khớp chính xác và phân tích.Numeric types
: bao gồm long, integer, short, byte, double, float.Date
: sử dụng cho dữ liệu ngày tháng.Boolean
: cho giá trị đúng/sai.Geo-point
vàGeo-shape
: phục vụ cho dữ liệu địa lý.IP
: cho địa chỉ IP.
III. Indexing
Analyzers là bộ não của Elasticsearch, chịu trách nhiệm phân tích và chuẩn hóa dữ liệu, giúp cải thiện chất lượng tìm kiếm.
1. Quá Trình Phân Tích
Quá trình phân tích gồm có 3 giai đoạn:
- Character filters: Làm sạch văn bản thô như loại bỏ HTML tags và chuyển đổi ký tự.
- Tokenizer: Chia văn bản thành các từ hoặc cụm từ riêng lẻ.
- Token filters: Làm các điều chỉnh cho từng token như chuyển đổi chữ hoa thành chữ thường, loại bỏ dấu câu.
- Indexing: Tạo inverted index để lưu trữ thông tin về các token và các tài liệu chứa chúng.
2. Các Loại Analyzers Phổ Biến
Elasticsearch cung cấp 4 loại analyzers phổ biến:
Standard analyzer
: Phân tích văn bản và loại bỏ dấu câu.Simple analyzer
: Chỉ quan tâm đến chữ cái.Whitespace analyzer
: Tách từ bằng khoảng trắng.Language-specific analyzers
: Hỗ trợ cho từng ngôn ngữ cụ thể.
IV. Chiến Lược Reindexing và Cập Nhật Không Dừng
1. Thay Đổi Nhỏ Của Dữ Liệu
Để đồng bộ dữ liệu giữa cơ sở dữ liệu chính (sử dụng Postgres) và Elasticsearch, có hai phương pháp:
- Chạy Cronjob: Thực hiện kiểm tra định kỳ để cập nhật dữ liệu.
- Trigger Sự Kiện Thay Đổi (CDC): Sử dụng event triggers để gửi yêu cầu cập nhật khi có thay đổi.
2. Tạo Index Mới
Khi cần thay đổi mapping, bước cần thực hiện là:
- Tạo một index mới với mapping mới.
- Sử dụng Reindex API để sao chép dữ liệu.
- Chuyển đổi traffic sang index mới qua alias.
- Thực hiện rolling update cho đến khi hoàn tất.
- Đóng index cũ sau khi chuyển đổi.
V. Tối Ưu Hóa Truy Vấn
1. Sử Dụng Query DSL Hiệu Quả
Elasticsearch sử dụng Query DSL
để xây dựng truy vấn, các loại truy vấn phổ biến bao gồm:
- match: Tìm kiếm toàn văn bản.
- multi_match: Tìm kiếm qua nhiều trường.
- bool query: Kết hợp các truy vấn.
2. Áp Dụng Filters
Sử dụng filters thay cho queries trong nhiều trường hợp vì tốc độ và hiệu suất cao hơn.
3. Tối Ưu Hóa Full-text Search
Cấu hình các analyzers đúng cách và sử dụng fuzzy search, synonyms, và ngram tokenizers giúp cải thiện chính xác của tìm kiếm.
4. Caching và Tuning Hiệu Suất
Cần tối ưu hóa cache truy vấn và cấu hình heap size cho JVM để giảm thiểu độ trễ và xử lý hiệu suất.
5. Scale Up
Khi mở rộng hệ thống, cần cân nhắc đến shards và replicas, đảm bảo rằng việc cấu hình làm tăng tính khả dụng và phục hồi của hệ thống.
6. Shards và Replicas
Trách nhiệm của shards là phân chia dữ liệu, còn replicas giúp tăng cường khả năng phục hồi.
VI. Kết Luận
Triển khai Elasticsearch một cách hiệu quả không chỉ yêu cầu hiểu biết về công nghệ mà còn cần nắm vững các yêu cầu kinh doanh và tối ưu hóa các quá trình. Hy vọng bài viết này giúp ích cho các bạn trong hành trình triển khai Elasticsearch.
VII. Tham Khảo
Tham gia nhóm Discord với hơn 2000 thành viên để thảo luận về lập trình và phát triển dự án cùng nhau.
source: viblo