Ruby on rails pg_搜索词的精确匹配
当试图在文档中查找“哈里森·福特”时,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_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(在我的小测试中)