Postgresql 上的部分字符串全文搜索

j0h*_*hny 2 database postgresql performance full-text-search

我被指派在 PostgreSql 9.3 上开发全文搜索功能,如果我能听到有关此事的其他意见和建议,我将非常高兴。

问题是,我需要实现部分单词匹配。用户将发送一个字符串,其中可以包含部分单词,用空格分隔,并且没有顺序。

例如:字符串“lue ped zeb”应该找到包含“Blue striped zebra”的行(在一列中)。它应该不区分大小写,并且单词的顺序不重要(但这些条件在这个问题中并不重要)。

问题是性能。数据库表中有超过 500 万行需要执行搜索,我需要非常短的执行时间。

示例查询是“SELECT * FROM table WHERE LOWER(text) LIKE ('%lue%ped%zeb');”,我怀疑这会非常慢,因为第一个位置的通配符将导致查询忽略索引。

到目前为止,我找到了http://www.sai.msu.su/~megera/wiki/wildspeed,这是一个可以帮助我的索引(在这种情况下索引的大小并不重要),但是生产服务器运行的是 MS Windows,我不知道这个扩展是否能够在 Windows 上编译。(我会尝试并更新我的问题)。

我不是数据库开发人员,通常仅在应用程序中使用 Postgres,因此我在数据库优化和较低级别操作方面没有太多经验。

有没有人有类似问题的经验、建议或例子可以帮助我完成这项任务?

poz*_*ozs 6

Trigram是 Postgres 的一个贡献模块,它可以帮助您实现目标。文档中有一个完整的用法示例。

从 9.1 开始,trigram 支持索引搜索LIKEILIKE运算符。

从 9.3 开始,它支持正则表达式匹配(~~*运算符)的索引搜索。

但是,如果您想搜索所提供的部分单词的任何顺序,您应该单独查询每个单词:

...
WHERE LOWER(text) LIKE '%lue%'
   OR LOWER(text) LIKE '%ped%'
   OR LOWER(text) LIKE '%zeb%'
Run Code Online (Sandbox Code Playgroud)