当尝试在文档中查找“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")
可以返回:
George Harrison drives a Ford Focus
我如何确保只返回与 'Harrison Ford'
完全匹配的结果?
最佳答案
您需要使用 pg_search
normalization ,或者基本上是 ranking search results 在 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
并将位于搜索结果列表的顶部。
关于ruby-on-rails - pg_search 搜索词的精确匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652256/