1

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

我的问题:我知道我可以使用pgSearchgem 来创建类似search_all_wordsor的范围search_any_words,但我不确定确保在结果集中只返回完全匹配的记录的最有效方法是什么。

也就是说,如果我搜索“教皇弗朗西斯”,我希望它只找到连续且顺序相同的这两个词(而不是说,“教皇名叫弗朗西斯”)。

到目前为止,我刚刚将 GIN 索引与ILIKE完全匹配搜索结合起来。但是考虑到 GIN 索引本质上是通过在每条记录中存储单词的确切位置来工作的,难道不应该有一种更有效(非ILIKE)的方法来确保搜索词与该字段完全匹配吗?

4

1 回答 1

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)

如果没有全文搜索,您可以通过扩展实现更快ILIKE的模式匹配。pg_trgm例子在这里

于 2016-04-11T20:55:49.260 回答