Trigram Index (pg_trgm) - Chỉ PostgreSQL

Giải pháp duy nhất (built-in) cho leading wildcard LIKE '%abc%' - hạn chế cơ bản của B+ tree.

-- Bật extension (có sẵn, chỉ cần kích hoạt)
CREATE EXTENSION IF NOT EXISTS pg_trgm;
 
-- Tạo trigram index
CREATE INDEX trgm_idx ON contacts USING GIN (name gin_trgm_ops);
 
-- Giờ query này dùng được index:
SELECT * FROM contacts WHERE name LIKE '%Nguyễn%';

Cách hoạt động

Text được chia thành mọi chuỗi con 3 ký tự (trigram), mỗi trigram được đánh index riêng (kiểu inverted index như GIN):

'Nguyễn Văn Minh' → trigrams: 'ngu', 'guy', 'uyễ', 'yễn', 'ễn ',
                              'n v', ' vă', 'văn', ..., 'min', 'inh'
 
Khi tìm '%Minh%':
1. Tách chuỗi tìm kiếm thành trigram: 'min', 'inh'
2. Tìm các entry chứa TẤT CẢ trigram này → danh sách ứng viên
3. Kiểm tra lại pattern chính xác trên ứng viên (trigram có thể khớp sai thứ tự)

Ưu / Nhược

  • ✅ Hỗ trợ ký tự đại diện ở bất kỳ vị trí nào
  • ❌ Index có thể rất lớn (mỗi chuỗi sinh nhiều trigram, tăng nhanh theo độ dài)
  • ❌ Chuỗi tìm kiếm phải có ít nhất 3 ký tự liên tục (không tính wildcard) để hoạt động hiệu quả

Lưu ý: Trigram index chỉ có trên PostgreSQL. MySQL, SQL Server không có tính năng tương đương tích hợp sẵn - cần tìm kiếm toàn văn phức tạp thì dùng công cụ chuyên biệt (Elasticsearch, MeiliSearch…).

Liên quan