Bỏ qua

ADR-004: PostgreSQL cho Full-text Search (Không Elasticsearch trong GĐ1)

Trạng thái

Accepted

Ngày

2026-04-08

Người quyết định

Tech Lead

Architecture Drivers

D4 (Đơn giản vận hành), D8 (Tiết kiệm chi phí)

Bối cảnh

Hệ thống cần full-text search cho tra cứu Từ điển Dữ liệu và similarity scoring cho AI matching. Lượng dữ liệu nhỏ: 200–3.000 Data Elements, < 50K tổng records. Đội 2 người không có Ops riêng.

Các Phương Án Xem Xét

Phương án A: PostgreSQL built-in (GIN indexes + pg_trgm + fuzzystrmatch)

  • Ưu điểm: Không thêm hạ tầng; GIN trigram indexes xử lý similarity search; pg_trgm và fuzzystrmatch là extension built-in; đủ cho < 50K records; single data source (không vấn đề đồng bộ)
  • Nhược điểm: Không mạnh bằng Elasticsearch cho query phức tạp; hiệu năng suy giảm ở quy mô rất lớn

Phương án B: Elasticsearch

  • Ưu điểm: Full-text search tốt nhất; BM25 scoring; faceted search; scale đến hàng triệu documents
  • Nhược điểm: Thêm hạ tầng (JVM, cluster management); phức tạp đồng bộ dữ liệu; overhead vận hành; overkill cho < 50K records; đội cần expertise ES

Quyết Định

Sử dụng Phương án A: PostgreSQL built-in search. GIN indexes với pg_trgm cung cấp trigram similarity search. fuzzystrmatch cung cấp Levenshtein distance. JSONB với jsonb_path_ops index hỗ trợ tra cứu synonym. Đủ cho lượng dữ liệu dự kiến (< 50K records).

Ngưỡng chuyển đổi: Nếu Data Element vượt 10K VÀ search latency vượt 3s tại P95 → đánh giá Elasticsearch.

Hệ Quả

Tích cực

  • Zero hạ tầng bổ sung
  • Single source of truth (không vấn đề đồng bộ dữ liệu)
  • Vận hành đơn giản hơn cho đội 2 người

Tiêu cực

  • Full-text search kém mạnh hơn Elasticsearch
  • Không có faceted search built-in (phải implement trong SQL)

Liên Quan

  • from-tran/PostgreSQL_vs_Elasticsearch_AI_Suggestion_Analysis.md (phân tích chi tiết)