有兩種索引可以用來加速全文搜尋:GIN 和 GiST。請注意,索引對於全文搜尋不是強制性的,但如果在列上經常進行搜尋,則通常需要索引。
要建立這樣的索引,請執行以下操作之一:
GIN 索引是首選的文字搜尋索引型別。作為倒排索引,它們為每個詞(詞素)包含一個索引條目,以及一個匹配位置的壓縮列表。多詞搜尋可以找到第一個匹配項,然後使用索引刪除缺少附加詞的行。GIN 索引僅儲存 tsvector
值中的詞(詞素),而不儲存它們的權重標籤。因此,在使用涉及權重的查詢時,需要重新檢查錶行。
GiST 索引是 有損的,這意味著索引可能會產生誤匹配,並且有必要檢查實際的錶行以消除這些誤匹配。(PostgreSQL 在需要時會自動執行此操作。)GiST 索引之所以有損,是因為每個文件在索引中都由一個固定長度的簽名表示。簽名長度(以位元組為單位)由可選的整數引數 siglen
決定。預設簽名長度(未指定 siglen
時)為 124 位元組,最大簽名長度為 2024 位元組。簽名是透過將每個單詞雜湊到 n 位字串的一個位中生成的,所有這些位都透過 OR 運算組合在一起以產生一個 n 位文件簽名。當兩個單詞雜湊到同一位位置時,會發生誤匹配。如果查詢中的所有單詞都有匹配項(真實或誤匹配),則必須檢索錶行以檢視匹配項是否正確。更長的簽名會帶來更精確的搜尋(掃描更小比例的索引和更少的堆頁),但代價是索引更大。
GiST 索引可以是覆蓋索引,即使用 INCLUDE
子句。包含的列可以是沒有任何 GiST 運算子類的任何資料型別。包含的屬性將以未壓縮的形式儲存。
有損性會導致效能下降,因為會不必要地獲取最終證明是誤匹配的表記錄。由於對錶記錄的隨機訪問速度很慢,這限制了 GiST 索引的實用性。誤匹配的可能性取決於幾個因素,特別是唯一單詞的數量,因此建議使用字典來減少這個數量。
請注意:GIN透過增加 maintenance_work_mem 可以經常提高索引構建時間,而GiST索引構建時間不受該引數的影響。
大型集合的分割槽以及 GIN 和 GiST 索引的正確使用,可以實現非常快速的線上更新搜尋。分割槽可以透過資料庫級別的表繼承來實現,或者透過在伺服器之間分發文件並透過外部搜尋結果收集,例如透過 外部資料 訪問來實現。後者是可能的,因為排名函式只使用本地資訊。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。