pg_search搜索词的完全匹配

Ash*_*ury 5 ruby postgresql full-text-search ruby-on-rails pg-search

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

  pg_search_scope :search_by_full_name, :against => [:first_name, :last_name]
Run Code Online (Sandbox Code Playgroud)

People.search_by_full_name("哈里森福特")

可以返回:

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

我怎样才能确保只'Harrison Ford'返回完全匹配?

Dmi*_*kov 1

您需要使用pg_search归一化,或者基本上对 Postgres 中的搜索结果进行排名。在以下示例中我什至没有使用归一化因子:

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;
Run Code Online (Sandbox Code Playgroud)

输出1:

   rank    
-----------
 0.0333333
(1 row)
Run Code Online (Sandbox Code Playgroud)

如果你有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;
Run Code Online (Sandbox Code Playgroud)

输出2:

 rank 
------
  0.1
(1 row)
Run Code Online (Sandbox Code Playgroud)

如果您ORDER BY rank DESC搜索了所有结果,您将得到您所需要的,因为所有彼此相邻的搜索词将是最高的rank,并且将位于搜索结果列表的顶部。