2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

12.9. 文字搜尋的首選索引型別 #

有兩種索引可以用來加速全文搜尋:GINGiST。請注意,索引對於全文搜尋不是強制性的,但如果在列上經常進行搜尋,則通常需要索引。

要建立這樣的索引,請執行以下操作之一:

CREATE INDEX name ON table USING GIN (column);

建立一個基於 GIN(廣義倒排索引)的索引。 column 必須是 tsvector 型別。

CREATE INDEX name ON table USING GIST (column [ { DEFAULT | tsvector_ops } (siglen = number) ] );

建立一個基於 GiST(廣義搜尋樹)的索引。 column 可以是 tsvectortsquery 型別。可選的整數引數 siglen 決定了簽名的長度(以位元組為單位,詳見下文)。

GIN 索引是首選的文字搜尋索引型別。作為倒排索引,它們為每個詞(詞素)包含一個索引條目,以及一個匹配位置的壓縮列表。多詞搜尋可以找到第一個匹配項,然後使用索引刪除缺少附加詞的行。GIN 索引僅儲存 tsvector 值中的詞(詞素),而不儲存它們的權重標籤。因此,在使用涉及權重的查詢時,需要重新檢查錶行。

GiST 索引是 有損的,這意味著索引可能會產生誤匹配,並且有必要檢查實際的錶行以消除這些誤匹配。(PostgreSQL 在需要時會自動執行此操作。)GiST 索引之所以有損,是因為每個文件在索引中都由一個固定長度的簽名表示。簽名長度(以位元組為單位)由可選的整數引數 siglen 決定。預設簽名長度(未指定 siglen 時)為 124 位元組,最大簽名長度為 2024 位元組。簽名是透過將每個單詞雜湊到 n 位字串的一個位中生成的,所有這些位都透過 OR 運算組合在一起以產生一個 n 位文件簽名。當兩個單詞雜湊到同一位位置時,會發生誤匹配。如果查詢中的所有單詞都有匹配項(真實或誤匹配),則必須檢索錶行以檢視匹配項是否正確。更長的簽名會帶來更精確的搜尋(掃描更小比例的索引和更少的堆頁),但代價是索引更大。

GiST 索引可以是覆蓋索引,即使用 INCLUDE 子句。包含的列可以是沒有任何 GiST 運算子類的任何資料型別。包含的屬性將以未壓縮的形式儲存。

有損性會導致效能下降,因為會不必要地獲取最終證明是誤匹配的表記錄。由於對錶記錄的隨機訪問速度很慢,這限制了 GiST 索引的實用性。誤匹配的可能性取決於幾個因素,特別是唯一單詞的數量,因此建議使用字典來減少這個數量。

請注意:GIN透過增加 maintenance_work_mem 可以經常提高索引構建時間,而GiST索引構建時間不受該引數的影響。

大型集合的分割槽以及 GIN 和 GiST 索引的正確使用,可以實現非常快速的線上更新搜尋。分割槽可以透過資料庫級別的表繼承來實現,或者透過在伺服器之間分發文件並透過外部搜尋結果收集,例如透過 外部資料 訪問來實現。後者是可能的,因為排名函式只使用本地資訊。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。