支援版本:目前 (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.2. 表格與索引 #

前一節中的範例說明了使用簡單常數字串進行全文比對。本節展示了如何搜尋表格資料,並可選擇使用索引。

12.2.2. 建立索引 #

我們可以建立一個GIN索引(第 12.9 節)以加速文字搜尋

CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector('english', body));

請注意,使用了 to_tsvector 的 2 個引數版本。只有指定組態名稱的文字搜尋函數才能在運算式索引中使用(第 11.7 節)。這是因為索引內容不得受 default_text_search_config 的影響。如果它們受到影響,索引內容可能會不一致,因為不同的項目可能包含使用不同文字搜尋組態建立的 tsvector,而且無法猜測哪個是哪個。無法正確傾印和還原此類索引。

由於在上面的索引中使用了 to_tsvector 的雙引數版本,因此只有使用 to_tsvector 的雙引數版本且具有相同組態名稱的查詢參考才會使用該索引。也就是說,WHERE to_tsvector('english', body) @@ 'a & b' 可以使用索引,但 WHERE to_tsvector(body) @@ 'a & b' 不能。這可確保索引僅與用於建立索引項目的組態一起使用。

可以設定更複雜的運算式索引,其中組態名稱由另一個欄位指定,例如

CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector(config_name, body));

其中 config_namepgweb 表格中的欄位。這允許在同一個索引中使用混合組態,同時記錄每個索引項目使用了哪個組態。舉例來說,如果文件集合包含不同語言的文件,這會很有用。同樣,旨在使用的索引的查詢必須以符合的方式措辭,例如,WHERE to_tsvector(config_name, body) @@ 'a & b'

索引甚至可以串連欄位

CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector('english', title || ' ' || body));

另一種方法是建立一個單獨的 tsvector 欄位來保存 to_tsvector 的輸出。為了使此欄位與其來源資料自動保持最新,請使用儲存的產生欄位。此範例是 titlebody 的串連,使用 coalesce 來確保當另一個欄位為 NULL 時,仍然會為一個欄位建立索引

ALTER TABLE pgweb
    ADD COLUMN textsearchable_index_col tsvector
               GENERATED ALWAYS AS (to_tsvector('english', coalesce(title, '') || ' ' || coalesce(body, ''))) STORED;

然後我們建立一個GIN索引以加速搜尋

CREATE INDEX textsearch_idx ON pgweb USING GIN (textsearchable_index_col);

現在我們準備好執行快速全文檢索

SELECT title
FROM pgweb
WHERE textsearchable_index_col @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC
LIMIT 10;

與運算式索引相比,單獨欄位方法的一個優點是不需要在查詢中明確指定文字搜尋組態,才能使用索引。如上面的範例所示,查詢可以取決於 default_text_search_config。另一個優點是搜尋速度會更快,因為不需要重新執行 to_tsvector 呼叫來驗證索引比對。(當使用 GiST 索引時,這比 GIN 索引更重要;請參閱第 12.9 節。)然而,運算式索引方法的設定更簡單,而且需要的磁碟空間更少,因為 tsvector 表示法沒有明確儲存。

提交更正

如果您在說明文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步說明的地方,請使用此表單回報說明文件問題。