Meilisearch: Bộ máy tìm kiếm “nhanh như chớp” thay thế Elasticsearch cho dự án vừa và nhỏ

Database tutorial - IT technology blog
Database tutorial - IT technology blog

Bạn đã quá mệt mỏi với sự cồng kềnh của Elasticsearch?

Cài đặt Elasticsearch cho một blog cá nhân hay web bán hàng quy mô vừa giống như dùng dao mổ trâu để giết gà. Bạn phải vật lộn với Java, hàng tá file YAML rắc rối và mức ngốn RAM lên tới hàng GB chỉ để làm một ô search cơ bản. Meilisearch sinh ra để giải quyết nỗi đau đó. Sau 6 tháng đưa vào production cho vài dự án thực tế, mình khẳng định đây là engine tìm kiếm “mì ăn liền” nhưng chất lượng cực kỳ cao cấp.

Được viết bằng Rust, Meilisearch cực kỳ nhẹ. Nó tập trung tối đa vào trải nghiệm người dùng với khả năng tìm kiếm tức thì (search-as-you-type) và chịu lỗi chính tả (typo-tolerance) cực tốt.

Triển khai nhanh Meilisearch trong 5 phút

Docker là lựa chọn tối ưu nhất để bắt đầu. Nó giúp môi trường phát triển sạch sẽ, không gây rác hệ điều hành.

1. Khởi động Service

docker run -it --rm \
    -p 7700:7700 \
    -v $(pwd)/meili_data:/meili_data \
    getmeili/meilisearch:latest

Lúc này, Meilisearch sẽ lắng nghe ở cổng 7700. Bạn có thể truy cập ngay http://localhost:7700 để trải nghiệm giao diện Web UI quản lý cực trực quan.

2. Đổ dữ liệu vào Index

Meilisearch sử dụng chuẩn RESTful API nên việc tích hợp rất dễ dàng. Bạn có thể dùng curl, Postman hoặc bất kỳ thư viện HTTP nào. Ví dụ, mình muốn lưu danh sách các bài viết IT:

curl \
  -X POST 'http://localhost:7700/indexes/posts/documents' \
  -H 'Content-Type: application/json' \
  --data-binary '[\
    {"id": 1, "title": "Hướng dẫn Redis cơ bản", "category": "Database"},\
    {"id": 2, "title": "Lập trình Python cho người mới", "category": "Programming"}\
  ]'

3. Kiểm tra tốc độ tìm kiếm

Thử tìm từ khóa “red”:

curl 'http://localhost:7700/indexes/posts/search?q=red'

Kết quả trả về gần như ngay lập tức. Trong các dự án của mình, độ trễ thường dưới 10ms đối với database khoảng 50.000 record.

Tại sao Meilisearch lại là lựa chọn “đáng đồng tiền bát gạo”?

Nhiều người thường lăn tăn giữa Meilisearch và Elasticsearch. Tuy nhiên, sự phù hợp mới là yếu tố quyết định.

  • Tiết kiệm tài nguyên: Elasticsearch cần ít nhất 2GB RAM để chạy ổn, trong khi Meilisearch chỉ ngốn khoảng 150MB cho cùng một lượng dữ liệu.
  • Cấu hình cực nhàn: Quên đi khái niệm Shards, Replicas hay Mapping phức tạp. Mọi thứ được tự động hóa tối đa.
  • Xử lý sai chính tả thông minh: Người dùng gõ “pyton” vẫn ra kết quả “Python”. Tính năng typo-tolerance này hoạt động mặc định mà không cần cấu hình mệt mỏi.
  • Trải nghiệm người dùng: Tốc độ phản hồi siêu nhanh giúp tạo ra các thanh search box gợi ý kết quả ngay khi người dùng vừa chạm phím.

Khi làm việc với Meilisearch, việc chuẩn bị dữ liệu JSON là bắt buộc. Nếu bạn cần convert nhanh dữ liệu từ CSV cũ sang JSON, mình gợi ý công cụ tại toolcraft.app/vi/tools/data/csv-to-json. Nó chạy hoàn toàn trên trình duyệt nên rất an toàn cho dữ liệu khách hàng.

Tối ưu kết quả tìm kiếm với Ranking Rules

Dù mặc định đã rất tốt, bạn vẫn nên can thiệp vào Ranking Rules để kết quả “xịn” hơn.

Sắp xếp kết quả theo ý muốn

Meilisearch ưu tiên kết quả dựa trên độ khớp từ khóa và vị trí từ khóa. Nếu muốn ưu tiên bài viết mới nhất lên đầu, bạn chỉ cần thêm quy tắc sắp xếp theo timestamp:

curl \
  -X POST 'http://localhost:7700/indexes/posts/settings' \
  -H 'Content-Type: application/json' \
  --data-binary '{\
    "rankingRules": [\
      "words",\
      "typo",\
      "proximity",\
      "attribute",\
      "sort",\
      "exactness",\
      "published_at:desc"\
    ]\
  }'

Bảo mật với API Keys

Đừng bao giờ để Meilisearch “mở cửa” trên production. Hãy sử dụng MEILI_MASTER_KEY. Hệ thống sẽ tự tạo Default Search Key (an toàn để để lộ ở phía client) và Default Admin Key (chỉ giữ ở phía server).

Kinh nghiệm xương máu sau 6 tháng vận hành

Vận hành thực tế khác xa với lý thuyết. Đây là 4 điểm mình rút ra được:

1. Lưu ý về dung lượng ổ cứng

Meilisearch dùng LMDB để đạt tốc độ cực cao. Đổi lại, file database có thể phình to gấp 3-5 lần kích thước dữ liệu JSON thô. Bạn cần đảm bảo ổ cứng server còn dư dả không gian lưu trữ.

2. Đừng index bừa bãi

Chỉ index những trường cần tìm kiếm như title hay nội dung. Các trường như link ảnh hay metadata chỉ nên để trong attributesToRetrieve để tăng tốc độ xử lý và tiết kiệm bộ nhớ.

3. Khả năng xử lý tiếng Việt

Bộ tách từ (tokenization) của Meilisearch hỗ trợ tiếng Việt khá ổn. Tuy nhiên, nếu muốn tìm kiếm chính xác các từ có dấu/không dấu theo ngữ cảnh riêng, bạn nên tìm hiểu thêm về stopWordssynonyms.

4. Chiến lược sao lưu

Tính năng Dumps là cách đơn giản nhất để backup. Nó sẽ nén toàn bộ index thành một file. Khi cần chuyển server, chỉ cần khởi động Meilisearch kèm file dump này là xong.

# Tạo file dump
curl -X POST 'http://localhost:7700/dumps'

# Khôi phục dữ liệu
./meilisearch --import-dump /path/to/data.dump

Lời kết

Meilisearch là mảnh ghép hoàn hảo cho các ứng dụng vừa và nhỏ. Nó nhẹ, nhanh và cực kỳ dễ triển khai. Nếu bạn đang xây dựng blog IT hay web thương mại điện tử, hãy thử cài đặt Meilisearch ngay hôm nay. Bạn sẽ thấy ngạc nhiên vì tốc độ mà nó mang lại cho người dùng.

Share: