[英]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)
如果你有Harrison
和Ford
在一起 - 等级会更高:
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.