【问题标题】:Fulltext search with partial strings on Postgresql在 Postgresql 上使用部分字符串进行全文搜索
【发布时间】:2014-07-07 03:30:09
【问题描述】:

我被指派在 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,因此我在数据库优化和底层操作方面没有太多经验。

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

【问题讨论】:

  • 问题是,您所描述的不是类似 google 的全文搜索(例如,如果您正在寻找,google 不会找到 zebra zeb)。但是,在 Postgres 中有 真正的全文搜索支持:postgresql.org/docs/9.3/static/textsearch.html
  • 感谢您的快速回复!对不起,与谷歌的比较不正确。我知道 postgresql 全文搜索功能(含糊不清),但这并不是我想要的。我真的需要如上所述的部分单词匹配(为“ebr”返回“Zebra”)

标签: database performance postgresql full-text-search


【解决方案1】:

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

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

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

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

...
WHERE LOWER(text) LIKE '%lue%'
   OR LOWER(text) LIKE '%ped%'
   OR LOWER(text) LIKE '%zeb%'

【讨论】:

  • 非常感谢! Trigram 似乎可以解决我的问题,我一定会测试它。完成后我会在这里发布我的结果。
  • 好的,所以我尝试了 Trigram 扩展,它确实以我需要的方式工作。谢谢 - 你为我节省了很多时间!
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多