Triển khai Typesense với Docker: Xây dựng Instant Search tốc độ cao cho ứng dụng

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

Tại sao nên chọn Typesense thay vì Elasticsearch hay SQL?

Nếu từng thử tìm kiếm bằng câu lệnh LIKE %query% trong SQL, chắc hẳn bạn đã thấy cảnh hệ thống “đứng hình” khi dữ liệu chạm mốc vài trăm ngàn dòng. Elasticsearch là giải pháp thay thế phổ biến, nhưng nó lại quá ngốn RAM. Thông thường, Elasticsearch cần ít nhất 2GB RAM chỉ để khởi động ổn định.

Typesense là một lựa chọn thay thế gọn nhẹ hơn nhiều. Được viết bằng C++ và chạy hoàn toàn trên RAM, nó giúp tốc độ phản hồi (latency) luôn duy trì ở mức dưới 50ms.

Thực tế, một server Typesense chỉ cần khoảng 200MB RAM để xử lý trơn tru 100.000 bản ghi. Công cụ này hỗ trợ sẵn Typo Tolerance (tìm kiếm khi gõ sai) và Faceting mà không cần cấu hình phức tạp. Đây là lựa chọn lý tưởng để build tính năng tìm kiếm “gõ đến đâu ra kết quả đến đó” giống như Algolia nhưng với chi phí tự host gần như bằng 0.

Các khái niệm cốt lõi

Trước khi bắt đầu, bạn cần nắm vững 4 thành phần cơ bản sau:

  • Collections: Tương đương với Table trong SQL. Đây là nơi lưu trữ các nhóm dữ liệu cùng loại.
  • Documents: Các bản ghi cụ thể dưới dạng JSON.
  • Fields: Các trường thông tin (ví dụ: tên sản phẩm, giá tiền).
  • Schema: Bản thiết kế định nghĩa kiểu dữ liệu và quy định trường nào sẽ được đánh index.

Triển khai Typesense bằng Docker trong 5 phút

Sử dụng Docker giúp bạn cài đặt Typesense nhanh chóng mà không làm ảnh hưởng đến hệ thống hiện tại. Cách tốt nhất là dùng docker-compose để quản lý biến môi trường dễ dàng hơn.

1. Tạo file docker-compose.yml

Hãy tạo một thư mục dự án và thêm file docker-compose.yml với nội dung sau:

services:
  typesense:
    image: typesense/typesense:26.0
    container_name: typesense
    restart: on-failure
    ports:
      - "8108:8108"
    volumes:
      - ./typesense-data:/data
    command: 
      - '--data-dir' 
      - '/data' 
      - '--api-key=huongdanit_secret_key' 
      - '--enable-cors'

Lưu ý về thông số:

  • 8108: Cổng kết nối mặc định.
  • --api-key: Mã bảo mật để thao tác với API. Bạn nên đổi thành một chuỗi ngẫu nhiên dài hơn khi chạy thực tế.
  • --enable-cors: Cho phép trình duyệt gọi trực tiếp vào API, rất quan trọng khi làm Frontend Search.

2. Khởi động Container

Chạy lệnh sau tại terminal:

docker-compose up -d

Để kiểm tra trạng thái, bạn truy cập http://localhost:8108/health. Nếu trình duyệt hiện {"ok":true}, hệ thống đã sẵn sàng.

Thực hành: Tạo Schema và Import dữ liệu

Khi server đã chạy, chúng ta cần định nghĩa cấu trúc dữ liệu cho nó.

Bước 1: Tạo Schema cho sản phẩm

Sử dụng curl để tạo một collection tên là products:

curl "http://localhost:8108/collections" \
  -X POST \
  -H "X-TYPESENSE-API-KEY: huongdanit_secret_key" \
  -d '{
    "name": "products",
    "fields": [
      {"name": "title", "type": "string" },
      {"name": "category", "type": "string", "facet": true },
      {"name": "price", "type": "float" },
      {"name": "rating", "type": "int32" }
    ],
    "default_sorting_field": "rating"
  }'

Bước 2: Import dữ liệu hàng loạt

Typesense yêu cầu định dạng JSONL (mỗi dòng là một object JSON) để đạt tốc độ import cao nhất. Nếu bạn đang có file CSV từ Excel, hãy chuyển đổi nó sang JSON trước.

Mẹo nhỏ: Bạn có thể dùng công cụ chuyển đổi tại toolcraft.app để xử lý nhanh dữ liệu mẫu ngay trên trình duyệt mà không lo lộ data.

Sau khi có file products.jsonl, hãy đẩy dữ liệu vào hệ thống:

curl "http://localhost:8108/collections/products/documents/import?action=create" \
  -X POST \
  -H "X-TYPESENSE-API-KEY: huongdanit_secret_key" \
  --data-binary "@products.jsonl"

Truy vấn tìm kiếm: Sức mạnh của Instant Search

Thử tìm kiếm với từ khóa bị gõ sai (ví dụ: “ipone” thay vì “iphone”):

curl "http://localhost:8108/collections/products/documents/search?q=ipone&query_by=title" \
  -H "X-TYPESENSE-API-KEY: huongdanit_secret_key"

Typesense sẽ trả về kết quả gần đúng kèm thông tin highlight. Tính năng này giúp bạn bôi đậm từ khóa khớp trên giao diện, tạo trải nghiệm tìm kiếm cực kỳ mượt mà cho người dùng.

Kinh nghiệm tối ưu Typesense trong Production

Dưới đây là những lưu ý quan trọng để hệ thống vận hành ổn định hơn:

  1. Phân quyền API Key: Tuyệt đối không dùng Admin Key ở phía Frontend. Hãy tạo “Search Only Key” để giới hạn quyền, chỉ cho phép tìm kiếm dữ liệu.
  2. Giám sát RAM: Vì dữ liệu nằm trên RAM, hãy thiết lập cảnh báo khi dung lượng trống còn dưới 20%. Nếu RAM đầy, container có thể bị crash đột ngột (OOM).
  3. Sử dụng Aliases: Bạn nên tạo alias products_live trỏ đến products_v1. Khi cần re-index lại toàn bộ dữ liệu vào products_v2, bạn chỉ cần đổi hướng alias mà không gây gián đoạn dịch vụ.
  4. Chiến lược Backup: Typesense ghi log xuống đĩa cứng tại thư mục /data. Hãy đảm bảo bạn có lịch backup định kỳ cho thư mục này để tránh mất mát dữ liệu.

Kết luận

Typesense là sự cân bằng tuyệt vời giữa hiệu năng và tính đơn giản. Với Docker, việc triển khai chỉ mất vài phút, giúp bạn tập trung vào phát triển tính năng thay vì vật lộn với cấu hình server. Nếu dự án của bạn cần bộ search thông minh với chi phí hạ tầng thấp, hãy thử Typesense ngay.

Hy vọng bài viết giúp bạn xây dựng được hệ thống tìm kiếm ưng ý. Nếu gặp lỗi trong quá trình cài đặt, hãy để lại bình luận bên dưới để mình hỗ trợ nhé!

Share: