pg_bigmは、AnalyticDB for PostgreSQLでサポートされているオープンソースのサードパーティ拡張機能です。 pg_bigm拡張機能はフルテキスト検索機能を提供し、検索プロセスを高速化するために2グラムのGeneralized Inverted Index (GIN) インデックスを作成できます。
pg_bigm拡張は、テキストから2文字で構成されるトライグラムを抽出します。 2文字未満のトライグラムには、1つのスペースのプレフィックスまたはサフィックスが含まれます。 例:
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)使用上の注意
elastic storageモードのAnalyticDB for PostgreSQLインスタンスの次のマイナーバージョンのみがpg_bigm拡張機能をサポートしています。
AnalyticDB for PostgreSQL V6.0: V6.6.2.1以降。
AnalyticDB for PostgreSQL V7.0: V7.0.6.1以降。
長さが107,374,180バイト (約102 MB) 以下の列にGINインデックスを作成できます。 例:
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 for PostgreSQLデータベースにデータがASCII形式で格納されていない場合は、データベースのエンコード形式をUTF-8に変更することを推奨します。 次のステートメントを実行して、現在のAnalyticDB for PostgreSQLデータベースのエンコード形式を照会できます。
SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = current_database();
Install the extension
AnalyticDB for PostgreSQLインスタンスのExtensionsページにpg_bigm拡張機能をインストールします。 詳細については、「拡張機能のインストール、更新、およびアンインストール」をご参照ください。
拡張機能を使用するUse the extension
インデックスの作成
次のサンプルコードは、インデックスの作成方法の例を示しています。
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)
Perform similarity search
次のサンプルコードは、=% 演算子を使用して類似性検索を実行する方法の例を示しています。
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グラム要素の配列を返すことができます。 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つの文字列間の最大の類似度を返すことができます。
2グラムアルゴリズムを使用する場合、文字列には1つのスペースのプレフィックスまたはサフィックスが含まれる場合があります。 以下の点にご注意ください。
「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_bigm拡張機能のpg_gin_pending_stats() 関数を使用して、GINインデックスの保留リスト内のページ数とタプル数を返すことができます。 例:
postgres=> SELECT * FROM pg_gin_pending_stats('pg_tools_idx');
pages | tuples
-------+--------
0 | 0
(1 ROW)GINインデックスを作成するときに、fastupdateパラメーターをoffに設定できます。 この場合、インデックスには保留リストがなく、0が返されます。 例:
CREATE INDEX ON your_table_name (your_column_name gin_trgm_ops) WITH (fastupdate = off);DEX ON your_table_name (your_column_name gin_trgm_ops) WITH (fastupdate = off);付録
Grand Unified Configuration (GUC) パラメーター
pg_bigm.last_update: pg_bigm拡張子が最後に更新された日付。 これは読み取り専用のパラメーターです。
pg_bigm.enable_recheck: 再チェックを実行するかどうかを指定します。 デフォルト値: on。 ビジネス要件に基づいてパラメーターを指定できます。 正しい結果を得るために、デフォルト値を保持することを推奨します。
pg_bigm.gin_key_limit: フルテキスト検索に使用できる2グラムの要素の最大数。 ビジネス要件に基づいてパラメーターを指定できます。 デフォルト値: 0。すべての2グラム要素が使用されることを指定します。 すべての2グラム要素を使用するとパフォーマンスが低下する場合は、パラメーターを小さな正の値に設定してパフォーマンスを向上させることができます。
pg_bigm.similarity_limit: 類似性検索に使用される最小しきい値。 類似度が指定されたしきい値を超えるタプルが類似度検索結果として返されます。
関数
関数 | 戻り値の型 | 説明 |
| String |
|
| text[ ] | 文字列内のすべての2グラム要素の配列を返します。 |
| real | 2つの文字列内の2グラム要素間の最大の類似性を示す浮動小数点数を返します。 数は0から1の範囲です。 値0は、2つの文字列の2グラム要素が完全に異なることを示します。 値1は、第1の文字列における2グラム要素集合と、第2の文字列における順序付けられた2グラム要素集合の連続範囲とが同一であることを示す。 |
演算子
演算子 | 戻り値の型 | 説明 |
テキスト % text | Boolean | 最初の文字列が2番目の文字列に似ている場合はtrueを返します。 この演算子は、SQL文の |
text =% text | Boolean | 最初の文字列のトリグラムと2番目の文字列のトリグラムの類似度が、 |
インデックス演算子
演算子 | 説明 |
gin_bigm_ops | テキストデータをトライグラムセットに変換し、GINインデックスを使用してトライグラムセットを格納します。 |