当试图在文档中找到“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'
的完全匹配?
答案 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)
如果您同时拥有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
,并且位于搜索的顶部结果清单。