2016-01-07 32 views
5

Kiedy próbuje znaleźć „Harrisona Forda” w dokumencie, pg_search powróci dowolny tekst, który zawiera „” oraz „Harrison Ford”, na przykład:pg_search dokładnego dopasowania wyszukiwanych haseł

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

People.search_by_full_name ("Harrison Ford")

może wrócić:

George Harrison jeździ Ford Focus

Jak mogę się upewnić, że tylko dokładne dopasowania z 'Harrison Ford' powrócą?

Odpowiedz

1

Musisz użyć pg_search normalization, lub w zasadzie ranking search results w Postgres. I nawet nie używać współczynnik normalizacji w poniższych przykładach:

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; 

Wyjście 1:

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

Jeśli masz Harrison i Ford razem - ranga będzie wyższa:

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) 

Jeśli uzyskasz wszystkie wyniki wyszukiwania, dostaniesz to, czego potrzebujesz, ponieważ wszystkie wyszukiwane słowa, które są obok siebie, będą najwyższe rank i znajdą się na górze listy wyników wyszukiwania.

+0

Niestety, nie rozumiem wyborów algorytmu normalizacji. Jaki próg ustalam, by pominąć cokolwiek innego niż dopasowanie ścisłe? – Ashbury

+0

chodzi o to, że słowa, które są obok siebie, będą miały najwyższą rangę, jeśli "ORDER BY ranking DESC" - dostaniesz do góry to, czego potrzebujesz; w moim przykładzie nie użyłem nawet współczynnika normalizacji @Ashbury –

+0

Problem polega na tym, że może on nadal zwracać serię bliskich dopasowań (i żadnych dokładnych dopasowań) uporządkowanych według tego, jak blisko jest oryginałowi. Nawet jeśli wziąłem najlepszy wynik, nie ma gwarancji, że będzie to dokładny mecz. – Ashbury