1. Giới thiệu
Elasticsearch là một search engine, dựa trên nền tảng Lucene, cho phép lưu trữ, tìm kiếm và phân tích dữ liệu thời gian thực với khả năng mở rộng cao.
2. Tại sao sử dụng Elasticsearch
2.1. Khả năng tìm kiếm mạnh mẽ
Elasticsearch cung cấp khả năng tìm kiếm toàn văn bản mạnh mẽ với các tính năng nâng cao như:
- Response time chỉ tính bằng xx ms (near-realtime)
- Fuzzy search: cho phép tìm kiếm gần đúng, hữu ích khi xử lý lỗi chính tả.
- Highlighting: đánh dấu các từ khóa tìm kiếm trong kết quả.
- Suggestions: đề xuất các từ khóa tương tự khi không tìm thấy kết quả chính xác.
- Hỗ trợ các loại dữ liệu không gian địa lý như geo_point và geo_shape.
- Cung cấp các queries đặc biệt như geo_distance và geo_bounding_box cho tìm kiếm dựa trên vị trí.
- Có thể tùy chỉnh để xử lý các ngôn ngữ đặc biệt.
2.2. Khả năng mở rộng và hiệu suất cao
- Kiến trúc phân tán cho phép mở rộng dễ dàng theo chiều ngang.
- Được thiết kế để xử lý hàng tỷ bản ghi với độ trễ thấp.
3. Cơ chế hoạt động của Elasticsearch
3.1. Apache Lucene và sự khác biệt
Elasticsearch được xây dựng trên nền tảng Apache Lucene - một thư viện tìm hỗ trợ tìm kiếm toàn văn. Nhưng apache sinh ra với nhiều hạn chế, và elasticsearch sinh ra để giải quyết vấn đề đó:
-
Lucene:
- Thư viện Java thuần túy
- Tập trung vào chức năng tìm kiếm cốt lõi
-
Elasticsearch:
- Cung cấp API RESTful
- Hệ thống phân tán, có khả năng mở rộng cao
- Dễ dàng triển khai và quản lý cluster
- Cung cấp các tính năng bổ sung như aggregations, machine learning
3.2. Cơ chế hoạt động
Inverted Index
Inverted Index là cấu trúc dữ liệu cốt lõi cho phép Elasticsearch thực hiện tìm kiếm full-text nhanh chóng. Cách inverted index được tổ chức (từ từ khoá -> danh sách documents)
Hãy tưởng tượng inverted index giống như mục lục ở một cuốn sách. Thay vì liệt kê các chương, nó liệt kê các từ quan trọng và số trang mà chúng xuất hiện.
Tokenization:
Tokenization là quá trình tách văn bản thành các đơn vị nhỏ hơn, gọi là token. Mỗi token thường là một từ hoặc cụm từ, và quá trình này là bước quan trọng trong việc phân tích văn bản để lập chỉ mục hoặc tìm kiếm. Quá trình phân tích sẽ gồm các bước sau:
- Tokenization: Chia văn bản thành các tokens.
- Normalization: Chuyển đổi tokens thành dạng chuẩn hóa (ví dụ: lowercase).
- Indexing: Lưu trữ các tokens và liên kết chúng với documents.
Thuật toán chấm điểm (Scoring Algorithm)
Elasticsearch sử dụng các thuật toán chấm điểm để xác định độ liên quan của kết quả tìm kiếm:
TF-IDF (Term Frequency-Inverse Document Frequency):
- Term Frequency: Số lần xuất hiện của term trong document.
- Inverse Document Frequency: Đánh giá tầm quan trọng của term trong toàn bộ corpus.
BM25 (Okapi BM25):
- Cải tiến của TF-IDF, xem xét độ dài của document.
Tùy chỉnh scoring:
- Sử dụng function_score query để áp dụng các hàm boost tùy chỉnh.
- Áp dụng field-level boosting để ưu tiên các trường quan trọng.
5. So sánh Elasticsearch với cơ sở dữ liệu truyền thống
Để hiểu rõ hơn về sức mạnh của Elasticsearch, hãy so sánh nó với PostgreSQL trong một trường hợp tìm kiếm cụ thể:
Ví dụ: Tìm kiếm từ khóa "bút chì" trong danh sách sản phẩm
Id | name | description |
---|---|---|
1 | cậu bé bút chì màu | Truyện tranh |
2 | chiếc bút chì kim | đồ dùng học tập |
3 | shin | truyện tranh về shin cậu bé bút chì mới nhất |
Tìm kiếm trong PostgreSQL:
SELECT * FROM product
WHERE name ILIKE '%bút chì%' OR description ILIKE '%bút chì%';
Quá trình xử lý:
- PostgreSQL sẽ quét qua toàn bộ bảng product (full table scan), trừ khi có index phù hợp. (Giả sử bạn đánh index b-tree thì khúc này toang)
- Với mỗi row, nó sẽ kiểm tra xem chuỗi "bút chì" có xuất hiện trong trường name hoặc description không.
- Việc sử dụng ILIKE với wildcard ở cả hai đầu (%...%) ngăn cản việc sử dụng index hiệu quả, ngay cả khi có.
- Thời gian xử lý tăng tuyến tính với số lượng records trong bảng. Ưu điểm:
- Đơn giản, dễ implement
- Chính xác cho exact substring matching Nhược điểm:
- Chậm với dữ liệu lớn
- Không hỗ trợ tốt cho tìm kiếm ngôn ngữ tự nhiên (ví dụ: không xử lý được từ đồng nghĩa, gần nghĩa)
- Không có scoring mechanism để sắp xếp kết quả theo độ liên quan
Tìm kiếm trong Elasticsearch:
{ "query": { "multi_match": { "query": "bút chì", "fields": ["name", "description"], "type": "best_fields" } }
}
Quá trình xử lý:
- Elasticsearch sử dụng inverted index để nhanh chóng định vị các documents chứa từ "bút" và "chì".
- Nó áp dụng các kỹ thuật xử lý ngôn ngữ tự nhiên:
- Tokenization: tách "bút chì" thành ["bút", "chì"]
- Normalization: chuyển về dạng chuẩn (ví dụ: lowercase)
- Có thể áp dụng stemming/lemmatization nếu được cấu hình
- Tìm kiếm các documents chứa cả "bút" và "chì" trong name hoặc description.
- Tính toán relevance score cho mỗi kết quả.
- Trả về kết quả đã được sắp xếp theo relevance score, ngay cả khi trong text có "cây bút chì màu" hoặc "bút và chì"
6. Các trường hợp sử dụng phổ biến của Elasticsearch
Elasticsearch có thể được áp dụng trong nhiều lĩnh vực khác nhau:
- Full-text search: Tìm kiếm nhanh chóng trong lượng lớn dữ liệu văn bản.
- Phân tích log: Tập trung và phân tích log từ nhiều nguồn khác nhau.
- Metrics: Thu thập và visualize các metrics từ hệ thống và ứng dụng.
- Security analytics: Phát hiện các mối đe dọa và anomalies trong dữ liệu bảo mật.