PostgreSQL có hỗ trợ full-text search không?
Nếu bạn đang tìm cách xây dựng một hệ thống tìm kiếm văn bản toàn phần (full-text search) trên một nền tảng cơ sở dữ liệu mã nguồn mở, thì chắc hẳn bạn sẽ tự hỏi: PostgreSQL có hỗ trợ full-text search không? Câu trả lời là CÓ – và không chỉ hỗ trợ, PostgreSQL còn tích hợp sẵn công cụ full-text search mạnh mẽ và linh hoạt ngay trong nhân hệ quản trị cơ sở dữ liệu của nó.
Full-text search trong PostgreSQL là gì?#
Full-text search là kỹ thuật cho phép bạn tìm kiếm từ khóa trong các văn bản dài một cách thông minh và chính xác hơn so với truy vấn LIKE thông thường. Nó không chỉ tìm các từ chính xác mà còn hỗ trợ phân tích ngữ nghĩa, loại bỏ từ dừng (stop words), tìm dạng từ gốc (stemming), và sắp xếp kết quả theo độ liên quan.
Trong PostgreSQL, full-text search được xây dựng dựa trên hai kiểu dữ liệu chính: tsvector và tsquery.
tsvector: đại diện cho văn bản đã được xử lý (chuẩn hóa) để sẵn sàng cho tìm kiếm.tsquery: đại diện cho truy vấn tìm kiếm do người dùng nhập vào.
PostgreSQL hỗ trợ full-text search như thế nào?#
PostgreSQL cho phép bạn chuyển đổi văn bản thành tsvector bằng hàm to_tsvector(), và thực hiện truy vấn bằng to_tsquery() hoặc plainto_tsquery(). Các truy vấn này có thể dùng toán tử @@ để kiểm tra sự khớp giữa truy vấn và văn bản.
Ví dụ đơn giản:
SELECT 'ChatGPT là công cụ AI thông minh'::tsvector @@ to_tsquery('AI');
Kết quả sẽ trả về true nếu từ khóa AI xuất hiện trong văn bản sau khi đã chuẩn hóa.
Làm thế nào để sử dụng full-text search với bảng dữ liệu?#
Giả sử bạn có bảng bai_viet với cột noi_dung chứa các đoạn văn bản. Bạn có thể tìm kiếm từ khóa trong cột này như sau:
SELECT * FROM bai_viet WHERE to_tsvector('tieng_viet', noi_dung) @@ plainto_tsquery('tieng_viet', 'trí tuệ nhân tạo');
Ở đây, 'tieng_viet' là cấu hình ngôn ngữ (PostgreSQL hỗ trợ nhiều ngôn ngữ như English, French, German, Vietnamese…). Nếu bạn không chỉ định, mặc định sẽ là english.
Có thể tạo chỉ mục để tăng tốc tìm kiếm không?#
Có. PostgreSQL cho phép tạo chỉ mục GIN (Generalized Inverted Index) trên cột tsvector để tăng tốc độ tìm kiếm.
Ví dụ:
CREATE INDEX idx_noi_dung_fts ON bai_viet USING GIN (to_tsvector('tieng_viet', noi_dung));
Sau khi có chỉ mục, truy vấn tìm kiếm sẽ nhanh hơn đáng kể, ngay cả khi bảng có hàng triệu bản ghi.
Những tính năng mạnh mẽ khác của full-text search PostgreSQL#
PostgreSQL không chỉ hỗ trợ tìm kiếm đơn thuần, mà còn hỗ trợ:
Kết hợp tìm kiếm full-text với điều kiện lọc (ví dụ: theo ngày, theo chuyên mục…)
Highlight kết quả tìm kiếm bằng
ts_headline()Xếp hạng độ liên quan của kết quả bằng
ts_rank()hoặcts_rank_cd()Tùy chỉnh từ dừng, cấu hình stemming theo ngôn ngữ
Những tính năng này khiến PostgreSQL trở thành lựa chọn đáng tin cậy cho các hệ thống tìm kiếm tài liệu, blog, forum, hoặc ứng dụng nội dung.
Khi nào nên dùng full-text search của PostgreSQL?#
Bạn nên sử dụng full-text search của PostgreSQL nếu:
Bạn cần tìm kiếm từ khóa trong văn bản, mô tả, bài viết hoặc nội dung lớn.
Hệ thống của bạn chưa cần đến các giải pháp chuyên dụng như Elasticsearch.
Bạn muốn tận dụng khả năng tìm kiếm mà không cần tích hợp thêm dịch vụ bên ngoài.
Bạn muốn xử lý truy vấn tìm kiếm kết hợp với logic SQL truyền thống (JOIN, GROUP BY, ORDER BY…).
Kết luận#
PostgreSQL hoàn toàn có hỗ trợ full-text search, và không chỉ dừng lại ở mức cơ bản mà còn cung cấp nhiều công cụ mạnh mẽ để bạn xây dựng hệ thống tìm kiếm hiệu quả và có thể mở rộng. Đây là một trong những điểm mạnh nổi bật khiến PostgreSQL được ưa chuộng trong các dự án thực tế cần xử lý văn bản, tin tức, bài viết hoặc các loại nội dung phong phú.