Theo sau từ this answer Tôi muốn biết cách tốt nhất để sử dụng tìm kiếm văn bản đầy đủ của PostgreSQL là gì nếu tôi muốn sắp xếp theo thứ hạng, giới hạn và .Cách tốt nhất để sử dụng xếp hạng tìm kiếm văn bản đầy đủ của PostgreSQL
Giả sử một bảng rất đơn giản.
CREATE TABLE pictures {
id SERIAL PRIMARY KEY,
title varchar(300),
...
}
hoặc bất kỳ thứ gì. Bây giờ tôi muốn tìm kiếm trường title
. Trước tiên, tôi tạo chỉ mục:
CREATE INDEX pictures_title ON pictures USING gin(to_tsvector('english', title));
Bây giờ tôi muốn tìm kiếm 'small dog'
. Đây hoạt động:
SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), 'small dog') AS score
FROM pictures
ORDER BY score DESC
Nhưng những gì tôi thực sự muốn là thế này:
SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), to_tsquery('small dog')) AS score
FROM pictures WHERE to_tsvector('english', pictures.title) @@ to_tsquery('small dog')
ORDER BY score DESC
Hoặc cách khác này (mà không hoạt động - không thể sử dụng score
trong mệnh đề WHERE
):
SELECT pictures.id, ts_rank_cd(to_tsvector('english', pictures.title), to_tsquery('small dog')) AS score
FROM pictures WHERE score > 0
ORDER BY score DESC
Cách tốt nhất để làm điều này là gì? Câu hỏi của tôi nhiều lần:
- Nếu tôi sử dụng phiên bản lặp đi lặp lại
to_tsvector(...)
, nó có đủ để lưu kết quả bằng cách nào đó không? - Có cách nào để thực hiện việc này mà không cần lặp lại các cuộc gọi chức năng
to_ts...
không? - Có cách nào để sử dụng
score
trong mệnh đềWHERE
không? - Nếu có, sẽ tốt hơn nếu lọc theo
score > 0
hoặc sử dụng điều@@
?
Câu trả lời này bỏ qua những gì seemse là phần quan trọng nhất của câu hỏi: "xếp hạng" – steviejay