有兩種索引可以用來加速全文搜尋:GIN 和 GiST。請注意,索引對於全文搜尋並非強制性的,但在定期搜尋欄位的情況下,通常需要索引。
要建立此類索引,請執行以下操作之一:
CREATE INDEX name
ON table
USING GIN (column
);
建立一個基於 GIN (Generalized Inverted Index,廣義反向索引) 的索引。column
必須是 tsvector
類型。
CREATE INDEX name
ON table
USING GIST (column
[ { DEFAULT | tsvector_ops } (siglen = number
) ] );
建立一個基於 GiST (Generalized Search Tree,廣義搜尋樹) 的索引。column
可以是 tsvector
或 tsquery
類型。可選的整數參數 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 索引的正確使用允許使用線上更新來實現非常快速的搜尋。可以使用表繼承在資料庫層級進行分割,或者透過在伺服器上分發文件並收集外部搜尋結果 (例如,透過 外部資料存取) 來進行分割。後者是可能的,因為排名函數僅使用本機資訊。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用 此表單 來回報文件問題。