ApsaraDB RDS for PostgreSQLによって提供されるpg_bigm拡張機能は、全文検索をサポートしています。 この拡張機能を使用して、2グラムの一般化逆インデックス (GIN) インデックスを作成できます。 これらのインデックスは、フルテキスト検索クエリの迅速化に役立ちます。
前提条件
RDSインスタンスはPostgreSQL 10以降を実行します。
説明この拡張機能は、PostgreSQL 17を実行するApsaraDB RDS for PostgreSQLインスタンスではサポートされていません。
RDSインスタンスは、20230830以降のマイナーエンジンバージョンを実行します。
重要この拡張機能は、20230830以前の一部のマイナーエンジンバージョンでサポートされています。 ただし、ApsaraDB RDSは、標準化された拡張機能管理とセキュリティ強化のために、マイナーエンジンバージョンの更新で脆弱な拡張機能を最適化する予定です。 したがって、20230830より前のマイナーエンジンバージョンを実行するRDSインスタンスでは、この拡張機能を作成することはできません。 詳細については、「 [製品の変更 /機能の変更] ApsaraDB RDS For PostgreSQLインスタンスの拡張機能作成の制限」をご参照ください。
20230830より前のマイナーエンジンバージョンを実行するRDSインスタンス用にこの拡張機能を既に作成している場合は、引き続きこの拡張機能を使用できます。
このエクステンションを初めて作成する場合、またはRDSインスタンスのエクステンションを再作成する必要がある場合は、RDSインスタンスのマイナーエンジンバージョンを最新バージョンに更新する必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
pg_bigmは、RDSインスタンスのshared_preload_librariesパラメーターの値に追加されます。
ApsaraDB RDSコンソールで、またはAPI操作を呼び出して、shared_preload_librariesパラメーターの値にpg_bigmを追加できます。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。
この拡張機能は、PostgreSQL 17を実行するApsaraDB RDS for PostgreSQLインスタンスではサポートされていません。
pg_bigmエクステンションとpg_trgmエクステンションの比較
pg_trgm拡張機能は、ApsaraDB RDS for PostgreSQLによっても提供されます。 pg_trgm拡張機能は、3グラムモデルを使用してフルテキスト検索を実行します。 pg_bigm拡張は、pg_trgm拡張に基づいて開発されています。 次の表に、2つの拡張機能の違いを示します。
機能性 | pg_trgm | pg_bigm |
フレーズマッチングモデル | 3グラム | 2グラム |
インデックスタイプ | ジンとギスト | GIN |
演算子 |
|
|
アルファベット以外のフルテキスト検索 | 非対応 | 対応 |
1 ~ 2文字のキーワードを使用したフルテキスト検索 | 低 | 速い |
類似検索 | 対応 | 対応 |
インデックス付き列の最大長 | 238,609,291バイト (約228 MB) | 107,374,180バイト (約102 MB) |
使用上の注意
GINインデックスを作成する列の長さは、107,374,180バイト (約102 MB) を超えることはできません。
RDSインスタンスのデータがASCII形式でエンコードされていない場合は、エンコード形式をUTF8に変更することを推奨します。
説明select pg_encoding_to_char(encoding) from pg_database where datname = current_database();
コマンドを実行して、RDSインスタンスのエンコード形式を照会できます。
基本操作
pg_bigm拡張を有効にします。
postgres=> create extension pg_bigm; CREATE EXTENSION
GINインデックスを作成します。
postgres=> CREATE TABLE pg_tools (tool text, description text); CREATE TABLE postgres=> INSERT INTO pg_tools VALUES ('pg_hint_plan', 'Tool that allows a user to specify an optimizer HINT to PostgreSQL'); INSERT 0 1 postgres=> INSERT INTO pg_tools VALUES ('pg_dbms_stats', 'Tool that allows a user to stabilize planner statistics in PostgreSQL'); INSERT 0 1 postgres=> INSERT INTO pg_tools VALUES ('pg_bigm', 'Tool that provides 2-gram full text search capability in PostgreSQL'); INSERT 0 1 postgres=> INSERT INTO pg_tools VALUES ('pg_trgm', 'Tool that provides 3-gram full text search capability in PostgreSQL'); INSERT 0 1 postgres=> CREATE INDEX pg_tools_idx ON pg_tools USING gin (description gin_bigm_ops); CREATE INDEX postgres=> CREATE INDEX pg_tools_multi_idx ON pg_tools USING gin (tool gin_bigm_ops, description gin_bigm_ops) WITH (FASTUPDATE = off); CREATE INDEX
フルテキスト検索クエリを実行します。
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)
pg_bigm拡張機能を無効にします。
postgres=> drop extension pg_bigm; DROP EXTENSION
基本機能
likequery
目的: この関数は、LIKEキーワードに基づいて識別できる文字列を生成するために使用されます。
リクエストパラメーター: この関数にはリクエストパラメーターが1つ含まれます。 このパラメーターのデータ型はSTRINGです。
戻り値: この関数は、LIKEキーワードに基づいて識別できる文字列を返します。
実装:
キーワードの前後にパーセント記号 (
%
) を追加します。パーセント記号 (
%
) をエスケープするには、後方スラッシュ (\
) を使用します。
例:
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
目的: この関数は、文字列のすべての2グラム要素を取得するために使用されます。
リクエストパラメーター: この関数にはリクエストパラメーターが1つ含まれます。 このパラメーターのデータ型はSTRINGです。
戻り値: このパラメーターは、文字列のすべての2グラム要素で構成される配列を返します。
実装:
文字列の前後にスペースを追加します。
文字列内のすべての2グラム要素を識別します。
例:
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
目的: この関数は、2つの文字列間の類似性を取得するために使用されます。
リクエストパラメーター: この関数には2つのリクエストパラメーターが含まれます。 これらのパラメーターのデータ型はSTRINGです。
戻り値: この関数は、2つの文字列間の類似性を示す浮動小数点数を返します。
実装:
2つの文字列の両方に含まれる2グラム要素を特定します。
戻り値は0 ~ 1の範囲内です。 値0は、2つの文字列が異なることを示します。 値1は、2つの文字列が同じであることを示します。
説明この関数は、各文字列の前後にスペースを追加します。 したがって、
ABC
文字列とB
文字列との間の類似度は0であり、ABC
文字列とA
文字列との間の類似度は0.25である。この関数は、大文字と小文字を区別します。 たとえば、この関数は、
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
目的: この関数は、GINインデックスの保留リスト内のページ数とタプル数を取得するために使用されます。
リクエストパラメーター: この関数には1つのパラメーターが含まれます。 このパラメーターには、GINインデックスの名前またはOIDを指定します。
戻り値: この関数は、GINインデックスの保留中のリスト内のページ数とタプル数の2つの値を返します。
説明GINインデックスのFASTUPDATEパラメーターをFalseに設定した場合、GINインデックスには保留リストがありません。 この場合、この関数は0と0の2つの値を返します。
例:
postgres=> SELECT * FROM pg_gin_pending_stats('pg_tools_idx'); pages | tuples -------+-------- 0 | 0 (1 row)
行動制御
pg_bigm.last_update
このパラメーターは、pg_bigm拡張子に対して最新の更新が行われた日付を示します。 このパラメーターのみを表示できます。 このパラメーターの値は変更できません。
例:
SHOW pg_bigm.last_update;
pg_bigm.enable_recheck
再チェックを実行するかどうかを指定します。
説明デフォルト値はONのままにすることを推奨します。 これにより、正確なクエリ結果を取得できます。
例:
postgres=> CREATE TABLE tbl (doc text); CREATE TABLE postgres=> INSERT INTO tbl VALUES('He is awaiting trial'); INSERT 0 1 postgres=> INSERT INTO tbl VALUES('It was a trivial mistake'); INSERT 0 1 postgres=> CREATE INDEX tbl_idx ON tbl USING gin (doc gin_bigm_ops); CREATE INDEX postgres=> SET enable_seqscan TO off; SET postgres=> 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) postgres=> postgres=> SELECT * FROM tbl WHERE doc LIKE likequery('trial'); doc ---------------------- He is awaiting trial (1 row) postgres=> SET pg_bigm.enable_recheck = off; SET postgres=> 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
このパラメータは、類似度のしきい値を指定します。 類似度が指定された閾値を超えるタプルは、類似度検索結果として返される。