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'返回完全匹配?
您需要使用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)
如果你有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;
Run Code Online (Sandbox Code Playgroud)
输出2:
rank
------
0.1
(1 row)
Run Code Online (Sandbox Code Playgroud)
如果您ORDER BY rank DESC搜索了所有结果,您将得到您所需要的,因为所有彼此相邻的搜索词将是最高的rank,并且将位于搜索结果列表的顶部。