ruby-on-rails - pg_search 搜索词的精确匹配

标签 ruby-on-rails ruby postgresql full-text-search pg-search

当尝试在文档中查找“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)

如果你同时拥有 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并将位于搜索结果列表的顶部。

关于ruby-on-rails - pg_search 搜索词的精确匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652256/

相关文章:

ruby - (J)Ruby - 杀死一个线程可以吗?

sql - 带有 postgresql 的 Rails : extract field from time is not working

javascript - 将 Rails 中的记录分组为图表?

ruby-on-rails - 在 CMS 页面中呈现动态内容

ruby-on-rails - Heroku上的Rails 4 + Memcached

ruby-on-rails - Rails 通过 div 包装有错误的字段

java - Docker 容器中 PostgreSQL 数据库的正确 JDBC 连接 URL

sql - 在 postgres 中拆分人名的最简单方法?

mysql - 您的 config/database.yml 可能编写不正确。请检查并修复任何错误

ruby-on-rails - 如何从sqlite将数据库更改为mongodb