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)