2017-05-31 27 views
0

我试图创建最快的方式来搜索PostgreSQL(版本9.4)中的数百万(80+ mio)记录,通过多列。PostgreSQL使用子字符串的全文搜索

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

目前我测试全文搜索,随后https://blog.lateral.io/2015/05/full-text-search-in-milliseconds-with-postgresql/

它的作品,但我想一些更灵活的方式来搜索。

目前,如果我有一列包含前。 “沃尔沃”和一个包含“蓝色”我能找到与搜索字符串“沃尔沃蓝色”的记录,但我也想找到使用“沃尔沃蓝光”的记录,就好像我使用LIKE和“%蓝光%” 。

这是可能的全文搜索?

+0

FTS具有前缀匹配功能,但总的来说,它并非旨在有效地执行此操作。 FTS的设计是围绕寻找词位匹配(而'蓝'与'蓝'不是匹配,但f.ex.'volvo','volvos'和'volvo's')。 - 如果你可以升级到9.6,'pg_trgm'有一个很好的新特性:字相似性,它可以处理你的用例。 – pozs

+0

9.6也增加了对FTS中“词组搜索”(多个相邻词)的支持。 –

+0

或者,对于其他解决方案,您可以分两步进行搜索:第一,您需要搜索每个单词的拼写错误(“pg_trgm”尤其擅长)。找到匹配后,您可以为最终用户提供在第二步搜索这些内容的可能性(类似f.ex.如果拼写错误的话,Google会如何处理)。 – pozs

回答

1

唯一的选择,以这样的事情是通过使用pg_trgm的contrib模块。

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

有两点需要注意:

  1. 使用%运营商可能会返回“假阳性结果”,所以一定要添加第二个条件(例如与LIKE),消除这些。

  2. 一个trigram搜索适用于较长的搜索字符串,但由于许多错误的肯定结果而导致短搜索字符串执行不良。

如果这样还不够好达到您的目的,您将不得不求助于第三方解决方案。

+0

他们的例子主要显示只搜索一列中的一个词。我如何搜索多列中的多个单词? –

+0

你可以在连接的列上使用一个'%'操作符('col1 ||''|| col2%'searchstring'')或者使用多个与'AND'连接的'%'比较('col1%'searchstring'AND col2%'searchstring'')。 –