Có phải tất cả các truy vấn phải có trong từ điển?
Không. Bởi vì chỉ có từ gốc (theo cấu hình tìm kiếm văn bản đã sử dụng ) nằm trong chỉ mục để bắt đầu. Nhưng quan trọng hơn:
Không . Bởi vì, trên đầu trang Tìm kiếm toàn văn bản đó cũng có khả năng khớp tiền tố :
Điều này sẽ làm việc:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
Lưu ý 3 điều:
Sử dụng to_tsquery()
, không plainto_tsquery()
, trong trường hợp này vì ( trích dẫn hướng dẫn ):
... plainto_tsquery
sẽ không nhận ra tsquery
toán tử, nhãn trọng lượng hoặc nhãn khớp tiền tố trong đầu vào của nó
Sử dụng 'simple'
cấu hình tìm kiếm văn bản để tạo tsquery
vì bạn rõ ràng muốn sử dụng từ 'tận dụng' và không áp dụng từ gốc.
Nối :*
để làm cho nó trở thành một tìm kiếm tiền tố, tức là tìm tất cả các từ vựng bắt đầu bằng 'avail'.
Quan trọng: Đây là một tìm kiếm tiền tố trên các từ vựng (từ gốc) trong tài liệu. Kết hợp biểu thức chính quy không có ký tự đại diện ( content ~* 'avail'
) không hoàn toàn giống nhau! Cái sau không được neo trái (bắt đầu từ vựng) và cũng sẽ tìm thấy 'FOOavail', v.v.
Không rõ liệu bạn muốn hành vi được nêu trong truy vấn của bạn hoặc tương đương với biểu thức chính quy được thêm vào. Các chỉ mục trigram ( pg_trgm
) như @Evan đã đề xuất là công cụ phù hợp cho việc đó. Có nhiều câu hỏi liên quan trên dba.SE, hãy thử tìm kiếm .
Tổng quat:
Bản giới thiệu
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
Câu trả lời liên quan gần đây (chương Cách tiếp cận khác nhau để tối ưu hóa tìm kiếm ):
Email?
Vì bạn đã đề cập đến email, hãy lưu ý rằng trình phân tích tìm kiếm văn bản xác định email và không phân tách chúng thành các từ / từ vựng riêng biệt. Xem xét:
SELECT ts_debug('english', 'xangr@some.domain.com')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
Tôi sẽ thay thế các dấu phân cách @
và .
trong email của bạn bằng dấu cách ( ' '
) để lập chỉ mục chứa các từ.
Ngoài ra, kể từ khi bạn đang đối phó với tên trong email, không phải với tiếng Anh (hoặc một số ngôn ngữ khác) từ , tôi sẽ sử dụng 'simple'
cấu hình tìm kiếm văn bản để bắt nguồn vô hiệu hóa và các ngôn ngữ các tính năng:
Xây dựng ts_vector
cột với:
SELECT to_tsvector('simple', translate('joe.xangr@some.domain.com', '@.', ' ')) AS tsv;
:*
tài liệu được ghi ở đâu và 2) không nên đề cập đến việc xây dựngto_tsvector('simple'..)
đi kèm với các hướng dẫn rằng việc truy vấn tsv đó trong tương lai sẽ yêu cầu cấu hình 'đơn giản' để phản đối? Tôi nghĩ bạn nên làm rõ sự phân nhánh của việc vô hiệu hóa bắt nguồn từ một tsvector / tsquery.