我有一个包含大约150万条记录的Postgres数据库。在我的Ruby on Rails应用程序中,我需要搜索statement_text
字段(可以包含1到数百个单词)。
我的问题:我知道我可以使用pgSearch
gem来创建search_all_words
或search_any_words
这样的范围,但我不确定什么是最有效的方法来确保完全匹配的记录将在结果集中返回。
也就是说,如果我搜索"教皇弗朗西斯",我希望它只有当他们连续并且按照相同的顺序时才能找到这两个单词(而不是说," ;教皇被命名为Francis")。
到目前为止,我只是将GIN索引与ILIKE
组合在一起进行完全匹配搜索。但鉴于GIN索引在每条记录中基本上都是storing the exact position of a word,所以不应该有一种更有效的(非ILIKE
)方式来确保搜索词完全匹配场?
答案 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)