0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Cách Triển Khai Elasticsearch: Hướng Dẫn Chi Tiết Từ A Đến Z

Đăng vào 1 tháng trước

• 4 phút đọc

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 Copy
{
  "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-pointGeo-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:

  1. Character filters: Làm sạch văn bản thô như loại bỏ HTML tags và chuyển đổi ký tự.
  2. Tokenizer: Chia văn bản thành các từ hoặc cụm từ riêng lẻ.
  3. 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.
  4. 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à:

  1. Tạo một index mới với mapping mới.
  2. Sử dụng Reindex API để sao chép dữ liệu.
  3. Chuyển đổi traffic sang index mới qua alias.
  4. Thực hiện rolling update cho đến khi hoàn tất.
  5. Đó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.

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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào