【问题标题】:PostgreSQL Full Text Search with substrings带有子字符串的 PostgreSQL 全文搜索
【发布时间】:2023-03-22 03:33:01
【问题描述】:

我正在尝试创建最快的方法来搜索 PostgreSQL(9.4 版)中的数百万(80+ mio)条记录,覆盖多个列。

我想尝试使用标准 PostgreSQL,而不是 Solr 等。

我目前正在测试关注https://blog.lateral.io/2015/05/full-text-search-in-milliseconds-with-postgresql/的全文搜索。

它有效,但我想要一些更灵活的搜索方式。

目前,如果我有一列包含 ex. "Volvo" 和一个包含 "Blue" .

全文搜索可以做到吗?

【问题讨论】:

  • FTS 具有前缀匹配功能,但一般而言,它的设计目的不是为了有效地做到这一点。 FTS 旨在寻找词位匹配(blublue 不匹配,但 f.ex. volvovolvosvolvo's 是)。 -- 如果你可以升级到 9.6,pg_trgm 有一个很好的新特性:单词相似度,它可以处理你的用例。
  • 9.6 还增加了对 FTS 中“短语搜索”(多个相邻单词)的支持。
  • 或者,对于替代解决方案,您可以分两步进行搜索:第一,您需要搜索每个单词的拼写错误(pg_trgm 在其中特别好)。找到匹配项后,您可以为最终用户提供在第二步中搜索匹配项的可能性(类似于 f.ex. 谷歌在您拼错单词时的处理方式)。

标签: sql postgresql full-text-search


【解决方案1】:

这样的唯一选择是使用pg_trgm contrib 模块。

这使您可以创建一个 GIN 或 GiST 索引来索引三个字符的所有序列,该索引可用于使用相似性运算符 % 进行搜索。

两个音符:

  1. 使用% 运算符可能会返回“误报”结果,因此请务必添加第二个条件(例如使用LIKE)来消除这些条件。

  2. 三元组搜索适用于较长的搜索字符串,但适用于较短的搜索字符串,因为存在许多误报结果。

如果这不足以满足您的目的,您将不得不求助于第三方解决方案。

【讨论】:

  • 他们的示例主要显示在一列中仅搜索一个单词。如何在多列中搜索多个单词?
  • 您可以在连接列上使用单个 % 运算符 (col1 || ' ' || col2 % 'searchstring') 或使用多个 % 比较与 AND (col1 % 'searchstring' AND col2 % 'searchstring') 连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多