PolarDB for PostgreSQL (Compatible with Oracle) のpg_bigm拡張機能は、フルテキスト検索を高速化するために使用される2グラムの汎用反転インデックス (GIN) インデックスを作成します。
前提条件
次のエンジンバージョンのいずれかを実行するPolarDB for PostgreSQL (Compatible with Oracle) クラスターが作成されます。
PolarDB for PostgreSQL (Compatible with Oracle) 2.0 (バージョン2.0.14.2.0以降)
PolarDB for PostgreSQL (Compatible with Oracle) 1.0 (バージョン1.1.28以降)
次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。
SHOW polar_version;
pg_bigmエクステンションとpg_trgmエクステンションの比較
PolarDB for PostgreSQL (Compatible with Oracle) のpg_trgm拡張は、3グラムモデルを使用して全文検索を実装します。 pg_bigm拡張は、pg_trgm拡張に基づいて開発されています。 次の表に、2つの拡張機能の違いを示します。
機能性 | pg_trgm | pg_bigm |
フレーズマッチングモデル | 3グラム | 2グラム |
インデックスタイプ | 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);
PolarDBクラスター内のデータがASCII形式でエンコードされていない場合は、エンコード形式をUTF-8に変更することを推奨します。 次の文を実行して、現在のデータベースのエンコード形式を照会します。
SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = current_database();
基本操作
pg_bigm拡張子を作成します。
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)
pg_bigm拡張子を削除します。
DROP EXTENSION pg_bigm;
基本機能
likequery
目的: LIKEキーワードに基づいて識別できる文字列を生成します。
リクエストパラメーター: STRING型の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グラム要素を取得します。
リクエストパラメーター: STRING型の1つのリクエストパラメーター。
戻り値: 文字列のすべての2グラム要素で構成される配列。
実装:
文字列の前後にスペースを追加します。
文字列内のすべての2グラム要素を識別します。
例:
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つの文字列間の類似性を取得します。
リクエストパラメーター: STRING型の2つのリクエストパラメーター。
戻り値: 2つの文字列の類似性を示す浮動小数点数。
実装:
2つの文字列の両方に含まれる2グラム要素を特定します。
戻り値の範囲は0から1です。 値0は、2つの文字列が異なることを示します。 値1は、2つの文字列が同じであることを示します。
説明この関数は、各文字列の前後にスペースを追加します。 したがって、
ABC
文字列とB
文字列との間の類似度は0であり、ABC
文字列とA
文字列との間の類似度は0.25である。この関数は大文字と小文字を区別します。 たとえば、この関数は、
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インデックスの保留リストのページ数とタプル数を取得します。
リクエストパラメーター: GINインデックスの名前またはOIDを指定するパラメーター。
戻り値: GINインデックスの保留リストのページ数とタプル数。
説明GINインデックスのFASTUPDATEパラメーターをFalseに設定した場合、GINインデックスには保留リストがありません。 この場合、この関数は0と0の2つの値を返します。
例:
SELECT * FROM pg_gin_pending_stats('pg_tools_idx');
サンプル結果:
pages | tuples -------+-------- 0 | 0 (1 row)
動作制御パラメータ
pg_bigm.enable_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パラメーターのデフォルト値を使用して、再チェックを実行します。
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に設定して、再チェックを実行しないようにします。
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グラムの要素の最大数を指定します。 デフォルト値は0で、すべての2グラム要素が使用されることを指定します。
説明すべての2グラム要素の使用によりクエリのパフォーマンスが低下した場合、このパラメーターの値を減らすことができます。
pg_bigm.similarity_limit
このパラメータは、類似度のしきい値を指定します。 類似度が指定された閾値を超えるタプルは、類似度検索結果として返されます。