2016-01-07 25 views
5

Khi cố gắng tìm "Harrison Ford" trong một tài liệu, pg_search sẽ trả lại bất kỳ văn bản có chứa 'Harrison' và 'Ford', ví dụ:kết hợp chính xác pg_search thuật ngữ tìm kiếm

pg_search_scope :search_by_full_name, :against => [:first_name, :last_name] 

People.search_by_full_name ("Harrison Ford")

có thể trở lại:

George Harrison lái một chiếc Ford Focus

Làm cách nào để đảm bảo chỉ khớp chính xác của 'Harrison Ford' sẽ trả về?

Trả lời

1

Bạn cần sử dụng pg_search normalization hoặc về cơ bản ranking search results trong Postgres. Tôi thậm chí không sử dụng yếu tố bình thường trong các ví dụ sau:

SELECT ts_rank_cd(vector,query) as rank 
FROM 
    to_tsvector('simple','George Harrison drives a Ford Focus') as vector, 
    to_tsquery('simple','Harrison & Ford') as query; 

Output 1:

rank  
----------- 
0.0333333 
(1 row) 

Nếu bạn có HarrisonFord với nhau - thứ hạng sẽ cao hơn:

SELECT ts_rank_cd(vector,query) as rank 
FROM 
    to_tsvector('simple','Harrison Ford drives a car') as vector, 
    to_tsquery('simple','Harrison & Ford') as query; 

Output 2:

rank 
------ 
    0.1 
(1 row) 

Nếu bạn ORDER BY rank DESC tất cả kết quả tìm kiếm, bạn sẽ nhận được những gì bạn cần, bởi vì tất cả các từ tìm kiếm bên cạnh nhau sẽ là cao nhất rank và sẽ ở đầu danh sách kết quả tìm kiếm của bạn.

+0

Xin lỗi, tôi không hiểu lựa chọn thuật toán chuẩn hóa. Tôi đã đặt ngưỡng nào để bỏ qua bất kỳ điều gì khác ngoài kết hợp chính xác? – Ashbury

+0

điểm ở đây là các từ bên cạnh nhau sẽ có thứ hạng cao nhất nếu bạn 'ORDER BY xếp hạng DESC' - bạn sẽ nhận được những gì bạn cần; trong ví dụ của tôi, tôi thậm chí không sử dụng hệ số chuẩn hóa @Ashbury –

+0

Vấn đề là điều này vẫn có thể trả về một loạt các trận đấu gần (và không có kết quả chính xác) được sắp xếp theo mức độ gần với bản gốc. Ngay cả khi tôi đã đạt được kết quả cao nhất thì không có gì đảm bảo rằng nó là một trận đấu chính xác. – Ashbury

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