2013-04-08 108 views
16

我對PostgreSQL,全文搜索和Trigram的整個概念有點困惑。在我的全文檢索查詢,我使用tsvectors,就像這樣:PostgreSQL全文搜索和Trigram混淆

SELECT * FROM articles 
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat'); 

的問題是,這種方法沒有考慮拼寫錯誤。然後我開始閱讀大約Trigram and pg_trgm

通過其他例子,看起來像trigram被使用或使用向量,但從來都沒有。所以我的問題是:他們曾經一起使用過嗎?如果是這樣,怎麼樣? trigram替換全文嗎? trigrams更準確嗎?關於績效的卦怎麼樣?

回答

29

他們服務於非常不同的目的。

  • 全文搜索用於返回匹配的朵朵詞的搜索查詢的文檔。
  • Trigrams爲您提供了一種比較兩個字符串並確定其外觀相似程度的方法。

考慮以下示例:

SELECT 'cat' % 'cats'; --true 

上述返回true因爲'cat'非常類似於'cats'(由pg_trgm限制所指示的)。

SELECT 'there is a cat with a dog' % 'cats'; --false 

以上的回報false因爲%正在尋找的相若方式兩個完整串之間,不找字cats的字符串。

SELECT to_tsvector('there is a cat with a dog') @@ to_tsquery('cats'); --true 

這將返回true becauase的tsvector轉化的字符串轉換成列表的朵朵字和忽略了一堆的常用詞(停用詞 - 像「是」 &「A」)...然後搜索的朵朵版本cats

這聽起來像你想使用卦來自動糾正你的ts_query但這不是真的可能(反正沒有任何有效的方式)。他們並不真的知道一個詞是misspelt,它可能與另一個詞有多相似。他們可能被用來搜索一個單詞表來嘗試和找到相似的單詞,允許你實現一個「你的意思是...」類型的功能,但這個單詞需要維護一個單獨的表,其中包含您的所有單詞search字段。

如果你有你想要的文本索引來匹配你可能想看看Synonym Dictorionaries

+0

我已經添加了幾個例子強調'%'和'之間的差別一些常用拼錯的詞/短語@@'來自每個分機。如果您的目標是找到包含英語的文檔(或任何已知的有您的字典的語言),那麼您就是在全文後。如果您的目標是將整個字段與整個字段的字符串進行匹配,並輸入一些重要的拼寫錯誤,那麼pg_trgm就是您想要的。 – 2013-04-08 18:16:28

+0

感謝您的解釋!這清理了很多。好吧,看起來問題可以通過擴展字典的知識來解決。 – 2013-04-08 18:18:44

+1

+1好,清楚的答案。 – 2013-04-08 18:52:12