pg_bigm是云原生數據倉庫 AnalyticDB PostgreSQL 版支持的一款開源第三方插件,該插件提供了全文本搜索能力,允許用戶創建一個二元語法(2-gram)的GIN索引來加速搜索過程。
在pg_bigm插件中,從文本提取的Trigram長度為2,對于長度小于2的Trigram,將以空格前后綴填充得到最終的Trigram,并且默認只能包含一個空格前綴和一個空格后綴。示例如下:
postgres=> 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)
注意事項
pg_bigm插件僅支持存儲彈性模式實例,并且內核版本須滿足以下條件:
AnalyticDB PostgreSQL 6.0版實例并且版本為v6.6.2.1及以上。
AnalyticDB PostgreSQL 7.0版實例并且版本為v7.0.6.1及以上。
建立GIN索引的列長度不可以超過107,374,180字節(約102 MB),示例如下:
postgres=> CREATE TABLE t1 (description text); CREATE TABLE postgres=> CREATE INDEX t1_idx ON t1 USING gin (description gin_bigm_ops); CREATE INDEX postgres=> INSERT INTO t1 SELECT repeat('A', 107374181); ERROR:OUT OF memory
如果云原生數據倉庫 AnalyticDB PostgreSQL 版數據庫中存儲內容的語言不是ASCII,建議您將數據庫的編碼方式改為UTF-8。查詢當前數據庫編碼方式的命令如下:
SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = current_database();
安裝插件
請您在云原生數據倉庫 AnalyticDB PostgreSQL 版實例插件管理中安裝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);
執行全文本搜索
您可以使用pg_bigm插件執行全文本搜索,示例如下:
postgres=> 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)
相似性搜索
您可以使用=%
操作符進行相似性搜索。示例如下:
postgres=> SET pg_bigm.similarity_limit TO 0.2;
SET
postgres=> SELECT tool FROM pg_tools WHERE tool =% 'bigm';
tool
---------
pg_bigm
pg_trgm
(2 ROWS)
插件常用函數
likequery函數
使用pg_bigm插件中的slikequery
函數及%
操作符生成可以被LIKE關鍵字識別的字符串。likequery
函數的更多信息,請參見附錄。示例如下:
postgres=> 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)
postgres=> 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函數
使用pg_bigm插件中的show_bigm
函數返回給定字符串的所有2-gram元素的集合。show_bigm
函數的更多信息,請參見附錄。示例如下:
postgres=> 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函數
使用pg_bigm插件中的bigm_similarity
函數計算兩個字符串的相似度。
計算 2-gram 時,會在字符串前后添加空格,因此需要注意以下內容:
‘ABC’
和‘B’
的相似度為0。‘ABC'
和‘A’
的相似度為0.25。
bigm_similarity
函數大小寫敏感,例如‘ABC’
和‘abc’
的相似度為0。
示例如下:
postgres=> SELECT bigm_similarity('full text search', 'text similarity search');
bigm_similarity
-----------------
0.5714286
(1 ROW)
postgres=> SELECT bigm_similarity('ABC', 'A');
bigm_similarity
-----------------
0.25
(1 ROW)
postgres=> SELECT bigm_similarity('ABC', 'B');
bigm_similarity
-----------------
0
(1 ROW)
postgres=> SELECT bigm_similarity('ABC', 'abc');
bigm_similarity
-----------------
0
(1 ROW)
pg_gin_pending_stats 函數
使用pg_gin_pending_stats
函數返回GIN索引待處理列表的頁面和元組的個數。示例如下:
postgres=> SELECT * FROM pg_gin_pending_stats('pg_tools_idx');
pages | tuples
-------+--------
0 | 0
(1 ROW)
在創建GIN索引時,您可以指定參數fastupdate
為off
,該GIN 索引不存在待處理列表,返回結果為0,示例如下:
CREATE INDEX ON your_table_name (your_column_name gin_trgm_ops) WITH (fastupdate = off);
附錄
GUC參數
pg_bigm.last_update:該插件的最后更新日期,只讀參數。
pg_bigm.enable_recheck:決定是否進行 recheck,默認為on
,用戶可以設置,建議保持默認值以保證結果正確性。
pg_bigm.gin_key_limit:限制用于全文本搜索的2-gram元素的最大個數,用戶可以設置,默認為0,代表使用所有的2-gram元素。如果使用所有的2-gram元素導致性能下降,可以設置成較小的正數,限制2-gram元素的個數提升性能。
pg_bigm.similarity_limit:設置相似度閾值,相似度超過這個閾值的元組會作為相似度搜索的結果。
函數
函數 | 返回值 | 描述 |
| string | 返回一個可以被 |
| text[ ] | 返回一個給定字符串中的所有2-gram元素的集合的數組。 |
| real | 返回一個浮點數,計算兩個字符串的相似度。該函數在第二個字符串中搜索并統計兩個字符串共有的2-gram元素。結果的范圍是0~1(0指兩個字符串完全不相似,1指第一個字符串和第二個字符串中的一個詞相同)。 |
操作符
操作符 | 返回值 | 描述 |
text % text | boolean | 檢查左側的文本是否與右側的文本相似,類似于SQL的 |
text =% text | boolean | 如果函數的第一個參數包含一個與第二個參數中的詞相似的詞,且這兩詞的相似度等于由 |
索引操作符
操作符 | 描述 |
gin_bigm_ops | 將文本數據轉換成 trigram,并使用 GIN 索引結構保存 trigram。 |