Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails pg_搜索词的精确匹配_Ruby On Rails_Ruby_Postgresql_Full Text Search_Pg Search - Fatal编程技术网

Ruby on rails pg_搜索词的精确匹配

Ruby on rails pg_搜索词的精确匹配,ruby-on-rails,ruby,postgresql,full-text-search,pg-search,Ruby On Rails,Ruby,Postgresql,Full Text Search,Pg Search,当试图在文档中查找“哈里森·福特”时,pg_搜索将返回任何包含“哈里森”和“福特”的文本,例如: pg_search_scope :search_by_full_name, :against => [:first_name, :last_name] 人物。按全名(“哈里森·福特”)搜索 可以返回: 乔治·哈里森开着一辆福特福克斯 我如何确保只返回与“哈里森·福特”完全匹配的内容?您需要在Postgres中使用,或者基本上是。在以下示例中,我甚至没有使用标准化因子: SELECT ts

当试图在文档中查找“哈里森·福特”时,pg_搜索将返回任何包含“哈里森”和“福特”的文本,例如:

  pg_search_scope :search_by_full_name, :against => [:first_name, :last_name]
人物。按全名(“哈里森·福特”)搜索

可以返回:

乔治·哈里森开着一辆福特福克斯

我如何确保只返回与“哈里森·福特”完全匹配的内容?

您需要在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)
如果您将哈里森和福特放在一起-排名将更高:

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
所有您的搜索结果,您将得到您所需要的,因为所有相邻的搜索词都将是最高的
排名
,并将位于搜索结果列表的顶部

对不起,我不明白标准化算法的选择。我应该设置什么阈值来忽略除精确匹配之外的任何内容?这里的要点是,如果您
按等级顺序描述,相邻的单词将具有最高的等级-您将获得所需的最高等级;在我的示例中,我甚至没有使用规范化因子@ashburyth。问题是,这仍然可以返回一系列近似匹配(并且没有精确匹配),按与原始值的接近程度排序。即使我得到了最好的结果,也不能保证它是精确匹配的。@Ashbury如果你要寻找精确的短语匹配-也许你需要检查非全文搜索,我将进行全文搜索,然后对结果使用模式匹配。使用tvector进行pg_搜索大约需要11ms,然后模式匹配结果为7ms,而模式匹配整个表格(460ms)。节省442ms(在我的小测试中)