0

Bài toán elasticsearch update lại từ điển đồng nghĩa

Trong Elasticsearch, khi cập nhật từ điển đồng nghĩa (synonyms), bạn cần làm mới lại phân tích cú pháp (analyzer), điều này yêu cầu cập nhật lại index settings hoặc reindexing dữ liệu. Dưới đây là các cách tiếp cận:


1. Sử dụng "reload search analyzers" (Elasticsearch 7.3+)

Nếu bạn sử dụng synonym file thay vì inline synonyms, bạn có thể cập nhật từ điển mà không cần reindex.

Bước 1: Cấu hình synonyms file

Cấu hình synonym_path trong Elasticsearch settings:

{
  "settings": {
    "analysis": {
      "filter": {
        "synonym_filter": {
          "type": "synonym",
          "synonyms_path": "analysis/synonyms.txt"
        }
      },
      "analyzer": {
        "synonym_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "synonym_filter"]
        }
      }
    }
  }
}

Bước 2: Cập nhật synonyms.txt

Khi admin thêm từ đồng nghĩa, cập nhật file synonyms.txt:

iphone, apple phone
laptop, notebook

Bước 3: Reload analyzer mà không cần reindex

Chạy API sau:

POST /my_index/_reload_search_analyzers

Elasticsearch sẽ cập nhật từ điển mới mà không ảnh hưởng đến dữ liệu.


2. Cập nhật inline synonyms (Cần reindex)

Nếu bạn không muốn dùng file, bạn có thể cập nhật synonyms trực tiếp trong index settings nhưng cần reindex.

Bước 1: Cập nhật settings

PUT /my_index/_settings
{
  "analysis": {
    "filter": {
      "synonym_filter": {
        "type": "synonym",
        "synonyms": [
          "iphone, apple phone",
          "laptop, notebook"
        ]
      }
    }
  }
}

Lưu ý: Nếu index đang hoạt động, thay đổi này không có hiệu lực ngay lập tức.

Bước 2: Reindex lại dữ liệu

Tạo index mới và copy dữ liệu từ index cũ:

POST _reindex
{
  "source": { "index": "my_index" },
  "dest": { "index": "my_index_v2" }
}

Sau đó, chuyển alias từ index cũ sang index mới.


3. Dùng Alias để tránh downtime

Bạn có thể dùng index alias để tránh downtime khi cập nhật từ điển.

Bước 1: Tạo alias cho index

POST _aliases
{
  "actions": [
    { "add": { "index": "my_index_v2", "alias": "my_index" } }
  ]
}

Bước 2: Reindex dữ liệu vào index mới

  • Khi admin cập nhật từ điển, bạn tạo một index mới my_index_v2 với cấu hình mới.
  • Dùng _reindex để chuyển dữ liệu.
  • Sau đó, cập nhật alias my_index trỏ sang my_index_v2, tránh downtime.

Tóm tắt cách tiếp cận

Cách Cần reindex? Có downtime? Dễ triển khai?
Reload search analyzers (synonym file) ❌ Không ❌ Không ✅ Dễ
Inline synonyms update ✅ Có ✅ Có ⚠️ Trung bình
Alias + Reindex ✅ Có ❌ Không 🔥 Tốt nhất cho production

Khuyến nghị:

  • Nếu có thể dùng synonym file → Dùng _reload_search_analyzers (Cách 1).
  • Nếu cần thay đổi nhanh nhưng chấp nhận downtime → Inline synonyms + Reindex (Cách 2).
  • Nếu yêu cầu uptime cao → Dùng Alias + Reindex (Cách 3).

Bạn đang dùng version Elasticsearch nào? Mình có thể giúp tối ưu cách làm cho phù hợp. 🚀


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí