pg_search 搜索词完全匹配

pg_search exact match of search terms

当尝试在文档中查找 "Harrison Ford" 时,pg_search 将 return 任何包含 'Harrison' 和 'Ford' 的文本,例如:

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

People.search_by_full_name("Harrison Ford")

可以 return:

George Harrison drives a Ford Focus

我怎样才能确保只有 'Harrison Ford' 的完全匹配才会 return?

您需要在 Postgres 中使用 pg_search normalization, or basically ranking search results。我什至没有在以下示例中使用归一化因子:

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;

输出 1:

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

如果您同时拥有 HarrisonFord - 排名会更高:

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;

输出 2:

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

如果你 ORDER BY rank DESC 所有的搜索结果,你会得到你需要的,因为所有相邻的搜索词都会最高 rank 并且会在顶部您的搜索结果列表。