+4

Full-Text Search trong PostgreSQL - Phần 2

Phần 2: TSVector và TSQuery trong PostgreSQL

Ở cuối phần 1 mình có đề cập đến quá trình tiền xử lý document của PostgreSQL, hôm nay mình sẽ nói chi tiết hơn cách mà PostgreSQL tiền xử lý.

2.1. TSVector

tsvector là một kiểu dữ liệu, đại diện cho document, và tối ưu hóa cho FTS. Nói đơn giản, tsvector là danh sách được sắp xếp của lexemes, vì vậy ngay cả khi không chỉ hỗ trợ tìm kiếm văn bản đầy đủ nó vẫn thực hiện tốt hơn so với việc tìm kiếm tiêu chuẩn.

--Ví dụ với câu "Hôm nay trời đẹp quá"

SELECT to_tsvector('Hôm nay trời đẹp quá, nay phải đi chơi thôi');

--Kết quả trả về:
--                                tsvector
"'chơi':9 'hôm':1 'nay':2,6 'phải':7 'quá':5 'thôi':10 'trời':3 'đi':8 'đẹp':4"

Dễ dàng nhận thấy, câu trên đã được tách ra thành các từ riêng biệt, được sắp xếp theo từ điển, kèm theo đó là vị trí xuất hiện trong câu, ví dụ chữ "hôm" xuất hiện ở vị trí thứ nhất, chữ "nay" ở vị trí thứ 2 và 6.

Với đặc điểm này, tsvector hay được dùng để đánh index cho các column cần thực hiện FTS.

2.2. TSQuery

tsquery là một kiểu dữ liệu cho các truy vấn văn bản với sự hỗ trợ của toán tử Boolean & (AND), | (OR), tsquery bao gồm lexemes (tùy chọn có nhãn bằng letter[s]) với các toán tử Boolean nằm ở giữa từng nhãn.

--Ví dụ với câu truy vấn "Hôm & trời"

SELECT to_tsquery('Hôm & trời');

--Kết quả trả về
--  tsquery
"'hôm' & 'trời'"

2.3. FTS Operator

FTS trong PostgreSQL sử dụng toán tử @@ cho 2 loại dữ liệu tsvector và tsquery, hỗ trợ các kiểu dữ liệu như TEXT, VARCHAR.

Cách sử dụng FTS Operator:

tsvector @@ tsquery

tsquery @@ tsvector

text @@ tsquery

text @@ text

--Ví dụ với câu lệnh sau

SELECT to_tsvector('Hôm nay trời đẹp quá, nay phải đi chơi thôi') @@ to_tsquery('Hôm & trời');

--Kết quả sẽ trả về 1 dữ liệu Boolean là t, tức là true. Chuỗi tìm kiếm khớp với dữ liệu cần tìm.

Bài tiếp theo mình sẽ hướng dẫn cách đánh index, Viết trigger, FTS nhiều Column trong 1 bảng. Các bạn nhớ đón đọc nhé :3


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí