pg_search搜索词的完全匹配

时间:2016-01-07 10:02:59

标签: ruby-on-rails ruby postgresql full-text-search pg-search

当试图在文档中找到“Harrison Ford”时,pg_search将返回包含“Harrison”和“Ford”的任何文本,例如:

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

People.search_by_full_name(“Harrison Ford”)

可以返回:

  

乔治哈里森驾驶福特福克斯

如何确保只返回'Harrison Ford'的完全匹配?

1 个答案:

答案 0 :(得分:1)

你需要在Postgres中使用pg_search normalization或基本上 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,并且位于搜索的顶部结果清单。