2017-05-31 88 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'')。 –