pg_bigm是PolarDB PostgreSQL版的一款外掛程式,該外掛程式提供了全文本搜尋能力,允許建立一個二元文法(2-gram)的GIN索引來加速搜尋過程。
前提條件
支援的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(核心小版本14.5.2.0及以上)
PostgreSQL 11(核心小版本1.1.28及以上)
您可通過如下語句查看PolarDB PostgreSQL版的核心小版本的版本號碼:
PostgreSQL 14
SELECT version();PostgreSQL 11
SHOW polar_version;
與pg_trgm異同
pg_trgm是PolarDB PostgreSQL版的另一款外掛程式,使用3-gram的模型來實現全文本搜尋。pg_bigm外掛程式是在pg_trgm基礎上繼續開發的,兩者的區別如下。
功能和特性 | pg_trgm | pg_bigm |
全文檢索搜尋的短語匹配方法 | 3-gram | 2-gram |
支援的索引類型 | GIN和GIST | GIN |
支援的全文本搜尋操作符號 |
|
|
非字母語言的全文本搜尋 | 不支援 | 支援 |
帶有1~2個字元的關鍵字的全文本搜尋 | 慢 | 快 |
相似性搜尋 | 支援 | 支援 |
最大可以索引的列大小 | 238,609,291位元組(約228 MB) | 107,374,180位元組(約102 MB) |
注意事項
建立GIN索引的列的長度不可以超過107,374,180位元組(約102 MB)。樣本如下:
CREATE TABLE t1 (description text); CREATE INDEX t1_idx ON t1 USING gin (description gin_bigm_ops); INSERT INTO t1 SELECT repeat('A', 107374181);如果資料庫中儲存的內容語言是非ASCII,則建議將資料庫的編碼方式改為UTF8。查詢當前資料庫編碼方式的命令如下:
SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = current_database();
基本操作
建立外掛程式。
CREATE EXTENSION pg_bigm;建立GIN索引時需要指定
pg_bigm外掛程式提供的操作符。CREATE TABLE pg_tools (tool text, description text); INSERT INTO pg_tools VALUES ('pg_hint_plan', 'Tool that allows a user to specify an optimizer HINT to PostgreSQL'); INSERT INTO pg_tools VALUES ('pg_dbms_stats', 'Tool that allows a user to stabilize planner statistics in PostgreSQL'); INSERT INTO pg_tools VALUES ('pg_bigm', 'Tool that provides 2-gram full text search capability in PostgreSQL'); INSERT INTO pg_tools VALUES ('pg_trgm', 'Tool that provides 3-gram full text search capability in PostgreSQL'); CREATE INDEX pg_tools_idx ON pg_tools USING gin (description gin_bigm_ops); CREATE INDEX pg_tools_multi_idx ON pg_tools USING gin (tool gin_bigm_ops, description gin_bigm_ops) WITH (FASTUPDATE = off);執行全文本搜尋。
SELECT * FROM pg_tools WHERE description LIKE '%search%';返回結果如下:
tool | description ---------+--------------------------------------------------------------------- pg_bigm | Tool that provides 2-gram full text search capability in PostgreSQL pg_trgm | Tool that provides 3-gram full text search capability in PostgreSQL (2 rows)使用
=%操作符執行相似性搜尋。SELECT tool FROM pg_tools WHERE tool =% 'bigm';返回結果如下:
tool --------- pg_bigm (1 row)卸載外掛程式
DROP EXTENSION pg_bigm;
外掛程式常用函數
likequery函數
作用:產生可以被LIKE關鍵字識別的字串。
參數:1個請求參數,類型為字串。
傳回值:可以被LIKE關鍵字識別的搜尋字串。
實現原理:
在關鍵詞前後添加
%符號。使用
\來自動轉義符號%。
樣本如下:
SELECT likequery('pg_bigm has improved the full text search performance by 200%');返回結果如下:
likequery ------------------------------------------------------------------- %pg\_bigm has improved the full text search performance by 200\%% (1 row)SELECT * FROM pg_tools WHERE description LIKE likequery('search');返回結果如下:
tool | description ---------+--------------------------------------------------------------------- pg_bigm | Tool that provides 2-gram full text search capability in PostgreSQL pg_trgm | Tool that provides 3-gram full text search capability in PostgreSQL (2 rows)
show_bigm函數
作用:返回給定字串的所有2-gram元素的集合。
參數:1個請求參數,類型為字串。
傳回值:數組,包含所有的2-gram元素。
實現原理:
在字串前後添加空白字元。
計算所有的2-gram子串。
樣本如下:
SELECT show_bigm('full text search');顯示結果如下:
show_bigm ------------------------------------------------------------------ {" f"," s"," t",ar,ch,ea,ex,fu,"h ","l ",ll,rc,se,"t ",te,ul,xt} (1 row)
bigm_similarity函數
作用:計算兩個字串的相似性。
參數:2個請求參數,類型為字串。
傳回值:浮點數,表示相似性。
實現原理:
統計兩個字串共有的2-gram元素。
相似性範圍是[0, 1],0代表兩個字串完全不一樣,1代表兩個字串一樣。
說明由於計算2-gram時,會在字串前後添加空格,於是
ABC和B的相似性為0,ABC和A的相似性為0.25。bigm_similarity函數是大小寫敏感的,例如,
ABC和abc的相似性為0。
樣本如下:
SELECT bigm_similarity('full text search', 'text similarity search');返回結果如下:
bigm_similarity ----------------- 0.571429 (1 row)SELECT bigm_similarity('ABC', 'A');返回結果如下:
bigm_similarity ----------------- 0.25 (1 row)SELECT bigm_similarity('ABC', 'B');返回結果如下:
bigm_similarity ----------------- 0 (1 row)SELECT bigm_similarity('ABC', 'abc');返回結果如下:
bigm_similarity ----------------- 0 (1 row)
pg_gin_pending_stats函數
作用:返回GIN索引的pending list中頁面和元組的個數。
參數:1個,GIN索引的名字或者OID。
傳回值:2個,pending list中頁面的數量和元組的數量。
說明如果GIN索引建立時,指定參數FASTUPDATE為False,則該GIN索引不存在pending list,即返回結果為0。
樣本如下:
SELECT * FROM pg_gin_pending_stats('pg_tools_idx');顯示結果如下:
pages | tuples -------+-------- 0 | 0 (1 row)
外掛程式行為控制參數
pg_bigm.enable_recheck
決定是否進行recheck。
說明建議您保持預設值(ON)以保證結果正確性。
樣本如下:
準備測試資料。
CREATE TABLE tbl (doc text); INSERT INTO tbl VALUES('He is awaiting trial'); INSERT INTO tbl VALUES('It was a trivial mistake'); CREATE INDEX tbl_idx ON tbl USING gin (doc gin_bigm_ops);執行如下查詢語句。
pg_bigm.enable_recheck為on時,即進行recheck:
SET enable_seqscan TO off; EXPLAIN ANALYZE SELECT * FROM tbl WHERE doc LIKE likequery('trial');返回結果如下:
QUERY PLAN ----------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on tbl (cost=20.00..24.01 rows=1 width=32) (actual time=0.020..0.021 rows=1 loops=1) Recheck Cond: (doc ~~ '%trial%'::text) Rows Removed by Index Recheck: 1 Heap Blocks: exact=1 -> Bitmap Index Scan on tbl_idx (cost=0.00..20.00 rows=1 width=0) (actual time=0.013..0.013 rows=2 loops=1) Index Cond: (doc ~~ '%trial%'::text) Planning Time: 0.117 ms Execution Time: 0.043 ms (8 rows)執行如下查詢語句:
SELECT * FROM tbl WHERE doc LIKE likequery('trial');返回結果如下:
doc ---------------------- He is awaiting trial (1 row)pg_bigm.enable_recheck為off時,即不進行recheck:
SET pg_bigm.enable_recheck = off; SELECT * FROM tbl WHERE doc LIKE likequery('trial');返回結果如下:
doc -------------------------- He is awaiting trial It was a trivial mistake (2 rows)
pg_bigm.gin_key_limit
限制用於全文本搜尋的2-gram元素的最大個數,預設為0,0代表使用所有的2-gram元素。
說明如果發現使用所有的2-gram元素導致效能下降,可以調整該參數值,限制2-gram元素的個數來提高效能。
pg_bigm.similarity_limit
設定相似性閾值,相似性超過這個閾值的元組會做為相似性搜尋的結果。