繁体   English   中英

pg_search 搜索词的精确匹配

[英]pg_search exact match of search terms

当试图在文档中查找“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'完全匹配的内容?

您需要使用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;

输出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并且将位于搜索结果列表的顶部。

您只需要在查询搜索词中用 <=> 替换空格字符,如下所示:

query.gsub!(' ', '<=>')
search_by_full_name(query)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM