1. Dùng LIKE / ILIKE (cơ bản nhất)
-- Tìm chứa chuỗi
SELECT * FROM table_name
WHERE column_name LIKE '%từ_khóa%';
-- Không phân biệt hoa thường (PostgreSQL)
WHERE column_name ILIKE '%từ_khóa%';
-- Tìm bắt đầu / kết thúc
WHERE column_name LIKE 'từ_khóa%'
WHERE column_name LIKE '%từ_khóa';
2. Full-Text Search (tốt hơn LIKE)
MySQL:
SELECT * FROM table_name
WHERE MATCH(column_name) AGAINST('từ khóa' IN NATURAL LANGUAGE MODE);
PostgreSQL:
SELECT * FROM table_name
WHERE to_tsvector('vietnamese', column_name) @@ to_tsquery('vietnamese', 'từ & khóa');
3. So sánh độ tương đồng (Similarity)
PostgreSQL (cần extension pg_trgm):
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- Tìm theo độ giống nhau (0 → 1)
SELECT *, similarity(column_name, 'từ khóa') AS score
FROM table_name
WHERE column_name % 'từ khóa' -- operator % (threshold mặc định 0.3)
ORDER BY score DESC;
MySQL (dùng hàm tự viết hoặc UDF, hoặc SOUNDEX):
-- SOUNDEX (phát âm gần giống)
SELECT * FROM table_name
WHERE SOUNDEX(column_name) = SOUNDEX('từ khóa');
4. Khoảng cách chỉnh sửa (Levenshtein)
PostgreSQL (extension fuzzystrmatch):
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
SELECT *, levenshtein(column_name, 'từ khóa') AS distance
FROM table_name
WHERE levenshtein(column_name, 'từ khóa') <= 3 -- cho phép sai tối đa 3 ký tự
ORDER BY distance;
5. Kết hợp nhiều điều kiện (thực tế hay dùng)
SELECT *
FROM table_name
WHERE column_name ILIKE '%từ%'
OR column_name % 'từ khóa' -- pg_trgm
OR levenshtein(column_name, 'từ khóa') <= 2
ORDER BY
CASE
WHEN column_name ILIKE 'từ khóa%' THEN 1
WHEN column_name ILIKE '%từ khóa%' THEN 2
ELSE 3
END,
similarity(column_name, 'từ khóa') DESC;