2013-04-08 54 views
16

Tôi hơi bối rối với toàn bộ khái niệm về PostgreSQL, tìm kiếm toàn văn và Trigram. Trong các truy vấn tìm kiếm văn bản đầy đủ của tôi, tôi đang sử dụng tsvectors, như vậy:Tìm kiếm văn bản đầy đủ của PostgreSQL và Trigram Confusion

SELECT * FROM articles 
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat'); 

Vấn đề là, phương pháp này không có lỗi chính tả. Sau đó, tôi bắt đầu đọc về Trigram and pg_trgm:

Nhìn qua các ví dụ khác, có vẻ như sử dụng trigram hoặc vectơ nhưng không bao giờ cả hai. Vì vậy, câu hỏi của tôi là: Họ có bao giờ được sử dụng cùng nhau? Nếu vậy, làm thế nào? Trigram có thay thế toàn văn không? Trigram có chính xác hơn không? Và làm thế nào là trigrams về hiệu suất?

Trả lời

29

Chúng phục vụ các mục đích khác nhau.

  • Tìm kiếm văn bản đầy đủ được sử dụng để trả lại tài liệu khớp với truy vấn tìm kiếm từ bắt nguồn.
  • Trigram cung cấp cho bạn một phương pháp để so sánh hai chuỗi và xác định xem chúng trông giống như thế nào.

Hãy xem xét các ví dụ sau:

SELECT 'cat' % 'cats'; --true 

Các lợi nhuận trên đúng bởi vì 'cat' khá giống với 'cats' (như quyết định bởi giới hạn pg_trgm).

SELECT 'there is a cat with a dog' % 'cats'; --false 

Các lợi nhuận trên false% đang tìm kiếm Tương tự giữa hai xâu, không tìm kiếm từ catstrong chuỗi.

SELECT to_tsvector('there is a cat with a dog') @@ to_tsquery('cats'); --true 

này trả true becauase tsvector chuyển chuỗi thành một danh sách bắt nguồn từ và bỏ qua một loạt các từ thông dụng (dừng lời - như 'là' & 'a') ... sau đó tìm kiếm các phiên bản bắt nguồn của cats.

Có vẻ như bạn muốn sử dụng trigrams để tự động sửats_query của bạn nhưng điều đó là không thực sự có thể (không có cách nào hiệu quả). Họ không thực sự biết một từ là lỗi chính tả, giống như cách nó có thể giống với từ khác. Họ có thể sử dụng để tìm kiếm một bảng từ để thử và tìm các từ tương tự, cho phép bạn triển khai tính năng loại "ý của bạn ...", nhưng từ này yêu cầu duy trì một bảng riêng biệt chứa tất cả các từ được sử dụng trong search trường.

Nếu bạn có một số từ thường misspelt/cụm từ mà bạn muốn các văn bản-index để phù hợp bạn có thể muốn nhìn vào Synonym Dictorionaries

+0

Tôi đã thêm một vài ví dụ để làm nổi bật sự khác nhau giữa '%' và ' @@ 'từ mỗi phần mở rộng. Nếu mục đích của bạn là tìm các tài liệu có chứa tiếng Anh (hoặc bất kỳ ngôn ngữ nào mà bạn có từ điển), thì bạn sẽ có toàn văn. Nếu mục đích của bạn là khớp một trường toàn bộ với một chuỗi của toàn bộ trường với một chút leeweigh cho lỗi chính tả, thì pg_trgm là những gì bạn muốn. –

+0

Cảm ơn bạn đã giải thích! Điều đó xóa nó rất nhiều. Ok, có vẻ như vấn đề có thể được giải quyết bằng cách mở rộng kiến ​​thức về từ điển của tôi. –

+1

+1 Câu trả lời hay, rõ ràng. –

Các vấn đề liên quan