2009-09-28 31 views
12

Hãy nói rằng bạn có một postgres 8,3 bảng như sau:Làm thế nào để bạn thực hiện tìm kiếm toàn văn dựa trên cụm từ trong postgres tận dụng lợi thế của chỉ mục toàn văn?

CREATE TABLE t1 (body text, body_vector tsvector);

Tôi muốn để có thể tìm kiếm nó cho các cụm từ bằng cách sử dụng chỉ mục toàn văn bản (GIST, Gin hoặc cả hai trên cột tsvector). Cách giải quyết tốt nhất mà tôi đã có thể tìm thấy đầu tiên là tìm kiếm toàn văn trên cả hai từ (boolean AND) và sau đó thực hiện so sánh tương tự trên phần thân của cụm từ. Tất nhiên, điều này không nắm bắt được bất kỳ kiểm tra gốc hoặc kiểm tra lỗi chính tả nào mà tìm kiếm toàn văn của postgres làm cho bạn. Một ví dụ của việc này là nếu tôi đang tìm kiếm cụm từ 'W1 W2', tôi muốn sử dụng:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

Có cách nào để làm điều này mà bạn không cần phải nghỉ mát để tìm kiếm trên cột văn bản?

Trả lời

11

Nếu bạn muốn đối sánh cụm từ chính xác, đó là cách để thực hiện. Bạn cũng có thể thử WHERE body_vector @@ plainto_tsquery ('w1 w2'), và sau đó đặt nó theo thứ hạng. (Điểm được rằng hits nơi những lời là ngay bên cạnh nhau nên kết thúc trên đỉnh)

4

Cập nhật: PostgreSQL 9.6 tìm kiếm văn bản hỗ trợ cụm

select 
    * 
from (values 
    ('i heart new york'), 
    ('i hate york new') 
) docs(body) 
where 
    to_tsvector(body) @@ phraseto_tsquery('new york') 

(1 row retrieved) 

hoặc theo khoảng cách giữa các từ:

-- a distance of exactly 2 "hops" between "quick" and "fox" 
select 
    * 
from (values 
    ('the quick brown fox'), 
    ('quick brown cute fox') 
) docs(body) 
where 
    to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved) 
+1

Có lẽ tôi đã không nắm bắt được mọi thứ, nhưng điều này không yêu cầu chuỗi đầu vào phải chứa cụm từ tìm kiếm giữa các dấu nháy đơn? Làm thế nào có thể bất cứ ai sử dụng nó nói chung, khi cụm từ đến từ đầu vào của người dùng, và tài liệu đến từ một cột cơ sở dữ liệu? –

+1

Đây vẫn chưa phải là "tìm kiếm cụm từ". Đó là chỉ làm việc kể từ khi cụm từ tsvector của bạn 'new york' được gói trong dấu nháy đơn. – soyayix

+0

Có cả hai chức năng không - nhưng chuỗi tsvector của bạn trong hầu hết các trường hợp sẽ không có dấu nháy đơn trên chúng - nếu có thì cụm từ tìm kiếm là gì .. Tôi có postgreSQL 9.4 và truy vấn bạn làm việc - đây không chỉ là cụ thể là 9.6. chọn 'i heart new york city' :: tsvector @@ 'new' :: tsquery, --true 'i heart new york city' :: tsvector @@ 'new & york' :: tsquery, - true 'i heart new york city' :: tsvector @@ '' 'new york' '' :: tsquery --false – soyayix

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