使用Postgres全文搜索搜索完全匹配的最佳方法是什么?

时间:2016-04-11 18:09:27

标签: ruby-on-rails postgresql full-text-search text-normalization

我有一个包含大约150万条记录的Postgres数据库。在我的Ruby on Rails应用程序中,我需要搜索statement_text字段(可以包含1到数百个单词)。

我的问题:我知道我可以使用pgSearch gem来创建search_all_wordssearch_any_words这样的范围,但我不确定什么是最有效的方法来确保完全匹配的记录将在结果集中返回。

也就是说,如果我搜索"教皇弗朗西斯",我希望它只有当他们连续并且按照相同的顺序时才能找到这两个单词(而不是说," ;教皇被命名为Francis")。

到目前为止,我只是将GIN索引与ILIKE组合在一起进行完全匹配搜索。但鉴于GIN索引在每条记录中基本上都是storing the exact position of a word,所以不应该有一种更有效的(非ILIKE)方式来确保搜索词完全匹配场?

1 个答案:

答案 0 :(得分:1)

一般来说,全文需要基于所使用的语言词典进行词干化,因此使用全文搜索,您可以使用ts_rank()函数,而不使用词干'simple'字典,用于确定您要搜索的短语的相关性。

WITH t(v) AS ( VALUES
  ('Test sentence with Pope Francis'),
  ('Test Francis sentence with Pope '),
  ('The pope is named Francis')
)
SELECT v,ts_rank(tsv,q) as rank
FROM t,
    to_tsvector('simple',v) as tsv,
    plainto_tsquery('simple','Pope Francis') AS q;

结果:

                v                 |   rank    
----------------------------------+-----------
 Test sentence with Pope Francis  | 0.0991032
 Test Francis sentence with Pope  | 0.0973585
 The pope is named Francis        | 0.0973585
(3 rows)

如果没有全文搜索,您可以使用pg_trgm扩展程序实现更快的ILIKE模式匹配。示例是here