Điều khiển truy vấn

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 317 - 320)

Chương 12. Tìm kiếm toàn văn

12.4. Tính năng bổ sung

12.4.2. Điều khiển truy vấn

Phần 12.3.2 đã chỉ ra cách mà các truy vấn thô có thể được biến đổi thành các giá trị tsquery. PostgreSQL cũng đưa ra các hàm và toán tử có thể được sử dụng để điều khiển các truy vấn nằm ở dạng tsquery rồi.

tsquery && tsquery

Trả về sự kết hợp AND của 2 truy vấn được đưa ra.

tsquery || tsquery

Trả về sự kết hợp OR của 2 truy vấn được đưa ra.

!! tsquery

Trả về phủ định (NOT) của truy vấn được đưa ra.

numnode(query tsquery) returns integer

Trả về số nút (các từ vị cộng với các toán tử) trong một tsquery. Hàm này là hữu dụng để xác định liệu query đó có ý nghĩa (trả về > 0), hay chỉ bao gồm các từ chết (trả về 0).

Các ví dụ:

SELECT numnode(plainto_tsquery(’the any’));

NOTICE: query contains only stopword(s) or doesn’t contain lexeme(s), ignored numnode

--- 0

SELECT numnode(’foo & bar’::tsquery);

numnode --- 3

querytree(query tsquery) returns text

Trả về vị trí của một tsquery mà có thể được sử dụng cho việc tìm kiếm một chỉ số. Hàm này là hữu dụng cho việc dò tìm các truy vấn không được đánh chỉ số, ví dụ các truy vấn chỉ chứa các từ chết hoặc chỉ các khoản phủ định. Ví dụ:

SELECT querytree(to_tsquery(’!defined’));

querytree ---

12.4.2.1. Viết truy vấn

Họ các hàm ts_rewrite tìm kiếm một tsquery được đưa ra cho các lần xuất hiện của một truy vấn con đích, và thay thế từng lần xuất hiện bằng một truy vấn con thay thế. Về cơ bản hoạt động này là một phiên bản đặc biệt của tsquery đối với sự thay thế các chuỗi con. Một sự kết hợp đích và thay thế có thể được nghĩ như một quy tắc viết lại truy vấn. Một tập hợp các qui tắc viết lại như vậy có thể là một sự trợ giúp tìm kiếm mạnh. Ví dụ, bạn có thể mở rộng sự tìm kiếm bằng việc sử dụng các từ đồng nghĩa (như, new york, big apple, nyc, gotham) hoặc làm hẹp lại tìm kiếm đó để hướng người sử dụng vào một số chủ đề nóng. Có một số sự chồng lấn trng chức năng giữa tính năng này và các từ điển từ đồng nghĩa (Phần 12.6.4). Tuy nhiên, bạn có thể sửa một tập hợp các qui định viết lại khi làm việc mà không phải đánh chỉ số lại, trong khi việc cập nhật một từ điển từ đồng nghĩa đòi hỏi việc đánh chỉ số lại phải được thực hiện.

ts_rewrite (query tsquery, target tsquery, substitute tsquery) returns tsquery

Dạng này của ts_rewrite đơn giản áp dụng một qui tắc viết lại duy nhất: target được thay thế bằng substitute bất kể khi nào nó xuất hiện trong query. Ví dụ:

SELECT ts_rewrite(’a & b’::tsquery, ’a’::tsquery, ’c’::tsquery);

ts_rewrite ---

’b’ & ’c’

ts_rewrite (query tsquery, select text) returns tsquery

Dạng ts_rewrite này chấp nhận một sự khởi đầu query và một lệnh SQL select, nó được đưa ra như một chuỗi văn bản. select phải có 2 cột dạng tsquery. Đối với từng hàng của kết quả

select, các lần xuất hiện của giá trị cột đầu tiên (đích) được thay thế bằng giá trị cột thứ 2 (thay thế) trong giá trị query hiện hành. Ví dụ:

CREATE TABLE aliases (t tsquery PRIMARY KEY, s tsquery);

INSERT INTO aliases VALUES(’a’, ’c’);

SELECT ts_rewrite(’a & b’::tsquery, ’SELECT t,s FROM aliases’);

ts_rewrite ---

’b’ & ’c’

Lưu ý rằng khi nhiều qui tắc viết lại được áp dụng theo cách này, thì trật tự ứng dụng có thể là quan trọng; nên trong thực tế bạn sẽ muốn truy vấn nguồn đối với ORDER BY một vài khóa xếp thứ tự.

Hãy xem xét một ví dụ khám phá vũ trụ cuộc sống thực. Chúng tôi sẽ mở rộng truy vấn supernovae

bằng việc sử dụng các qui tắc viết lại do bảng dẫn dắt:

CREATE TABLE aliases (t tsquery primary key, s tsquery);

INSERT INTO aliases VALUES(to_tsquery(’supernovae’), to_tsquery(’supernovae|sn’));

SELECT ts_rewrite(to_tsquery(’supernovae & crab’), ’SELECT * FROM aliases’);

ts_rewrite

---

’crab’ & ( ’supernova’ | ’sn’ )

Chúng ta có thể thay đổi các qui định viết lại chỉ bằng việc cập nhật bảng đó:

UPDATE aliases

SET s = to_tsquery(’supernovae|sn & !nebulae’) WHERE t = to_tsquery(’supernovae’);

SELECT ts_rewrite(to_tsquery(’supernovae & crab’), ’SELECT * FROM aliases’);

ts_rewrite

---

’crab’ & ( ’supernova’ | ’sn’ & !’nebula’ )

Việc viết lại có thể là chậm khi có nhiều qui tắc viết lại, vì nó kiểm tra từng qui tắc cho sự trùng khớp có khả năng. Để lọc ra các qui tắc không phải là ứng viên rõ ràng thì chúng ta có thể sử dụng

các toán tử ghép nối cho dạng tsquery. Trong ví dụ bên dưới, chúng ta chỉ chọn các qui tắc nào có thể trùng khớp với truy vấn ban đầu:

SELECT ts_rewrite(’a & b’::tsquery,

’SELECT t,s FROM aliases WHERE ”a & b”::tsquery @> t’);

ts_rewrite ---

’b’ & ’c’

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 317 - 320)

Tải bản đầy đủ (PDF)

(372 trang)