RDS for PostgreSQLで検索機能をリッチにするpg_trgm・pg_bigmの設定方法

記事タイトルとURLをコピーする

こんにちは!
エンタープライズクラウド部ソリューションアーキテクト課の足達です。

本ブログでは、RDS for PostgreSQLの拡張機能であるpg_trgmおよびpg_bigmの設定方法についてご共有したいと思います。

はじめに

私事ではありますが、最近、ANGEL Dojo 2025というものに参加させていただいていました。
(ANGEL Dojoについては別途ブログ参照)

作成したアプリケーション内で検索機能を導入するにあたり、あいまい検索や全文検索を高速に処理するため、pg_trgmpg_bigmといった拡張機能の導入を検討しました。
今回は、その検討過程の記録として、「メリット」「違い」「設定方法」について共有させていただこうと思います。

メリット

検索速度の向上

これらの拡張機能は「N-gram」という考え方に基づいています。
主な役割は、検索時にインデックスを利用できるようにすることです。
DBの特定のテーブルに対してWHERE column LIKE '%検索語%'のようなSQL文であいまい検索を行う場合、拡張機能によるインデックスがないと全件をスキャンすることになるため、データ量によっては非常にレスポンスが遅くなってしまいます。
pg_trgmpg_bigmの拡張機能でインデックススキャンを実現することにより、データ量が多くても高速に検索を完了させることができるようになります。

導入の容易さ

データベースの拡張機能として提供されているため、アプリケーションのコードに大きな変更を加えたり、追加のリソースを用意することなく、データベース側の設定とインデックスの追加だけで高速化を実現可能です。
開発・運用コストを抑えることができることもメリットの一つと考えられます。

pg_trgmとpg_bigmの違い

pg_trgmpg_bigmの最も大きな違いは、テキストをインデックス化(検索を高速化するための準備)する際の分割の単位です。

pg_trgm:3-gram(トリグラム)

テキストを3文字ずつに区切ってインデックスを作成します。
(例:「ポストグレスキューエル」という単語は、「ポスト」「ストグ」「トグレ」「グレス」… のように3文字で区切られる。)
3文字以上のキーワードであれば、インデックスが効率良く働き高速な検索が可能です。
英字や欧文のような、単語がスペースで区切られる言語でのあいまい検索に優れています。

pg_bigm:2-gram(バイグラム)

テキストを2文字ずつに区切ってインデックスを作成します。
(例:「ポストグレスキューエル」という単語は、「ポス」「スト」「トグ」「グレ」… のように2文字で区切られる。)
1〜2文字の短いキーワードでもインデックスが効くため、高速な検索が可能です。
日本語のように、単語がスペースで区切られず連続している言語(マルチバイト文字)の検索に特化して開発された経緯があり、日本語の検索精度が高いです。
ちなみに、今回のANGEL Dojoで作成したアプリケーションは主要言語が日本語だったため、こちらを採用しました。

設定方法

pg_trgm

pg_trgmは、特別な設定なしでも多くのRDS for PostgreSQLのバージョンで利用可能です。
各バージョンでサポートされているかどうかについては、以下を参照してください。

docs.aws.amazon.com

デフォルトでは無効になっているため、以下の2ステップで有効化させる必要があります。

1. データベースへの接続

psqlなどのクライアントツールを使って、RDS for PostgreSQLインスタンスに接続します。

2. 拡張機能の有効化

接続したデータベースに対して、以下のSQLコマンドを実行するだけで有効化は完了です。

CREATE EXTENSION pg_trgm;
pg_bigm

pg_bigmの場合は、利用を開始する前にRDSのパラメータグループで拡張機能名を許可リストに追加する作業が必要です。

1. パラメータグループの設定 (Amazon RDS コンソール)
  1. AWS Management ConsoleでRDSサービスに移動します。

  2. 画面左のナビゲーションペインからパラメータグループを選択します。

  3. 現在のインスタンスに割り当てられているカスタムパラメータグループ(または新しいパラメータグループ)を選択し、編集します。

  4. 以下のようにパラメータの値を編集します。

    パラメータ名 変更する値 補足
    shared_preload_libraries pg_bigmを追加 PostgreSQLサーバー起動時にライブラリをロードします。
    既存の値(pg_stat_statements,auto_explainなど)がある場合は、カンマ区切りで追記してください。
    ※パラメータグループの設定を反映させるためには、RDSの再起動が必要です。
2. データベースへの接続

pg_trgmと同様に、psqlなどのクライアントツールを使って、RDS for PostgreSQLインスタンスに接続します。

3. 拡張機能の有効化

接続したデータベースに対して、以下のSQLコマンドを実行すれば有効化は完了です。

CREATE EXTENSION pg_bigm;
補足
拡張機能の確認方法

拡張機能が正しくインストールされたかどうかは、データベースに接続して以下のSQLコマンドで確認できます。

\dx

このコマンドを実行すると、インストールされている拡張機能のリストにpg_trgmpg_bigmが表示されます。

GINインデックスの作成方法

上記はあくまで「利用可能な状態」にするまでの設定手順ですので、pg_trgmpg_bigmを使用して高度な検索機能を実装するためには、GINインデックスを作成する必要があります。
GINインデックスは、以下のようなSQL文で作成することができます。
index_name, table_name, column_nameにはそれぞれ任意の値を入れてください。

-- pg_trgmの場合
CREATE INDEX index_name ON table_name USING gin (column_name gin_trgm_ops);
.
.
-- pg_bigmの場合
CREATE INDEX index_name ON table_name USING gin (column_name gin_bigm_ops);

さいごに

いかがだったでしょうか?
高度な検索機能の実装方法については、外部の検索エンジンを導入する方法や、Amazon OpenSearch Serviceと連携させる方法など、要件に応じて様々あるかと思います。
今回は、データベースの拡張機能のみでキーワードの部分一致やスペルミスを許容するような「あいまい検索」が可能になるpg_trgmpg_bigmについてご紹介させていただきましたが、少しでも皆さまのお役に立てれば幸いです。

足達 巧 (記事一覧)

エンタープライズクラウド部・ソリューションアーキテクト課
23年新卒入社 / AWS認定13冠