[アップデート] Amazon RDS for PostgreSQLでpg_bigm拡張がサポートされました

2021.04.30

しばたです。

少し前のはなしですが、Amazon RDS for PostgreSQLでpg_bigm拡張がサポートされ全文検索が容易に実行できる様になりました。

本記事ではこのアップデートについて簡単に解説します。

Amazon RDS for PostgreSQLでのpg_bigm拡張サポート

PostgreSQLではデータベースの拡張機能として全文検索を導入することが可能で、RDS for PostgreSQLではこれまで3-gram検索を行うpg_trgm拡張がプレビュー機能として使用可能でしたが、今回は標準機能として2-gram検索を行うpg_bigm拡張が追加されています。

ユーザーガイドによる更新情報を見ると、pg_bigm拡張は既存の環境すべてというわけではなく現時点で最新マイナーアップデートから追加される形になっています。

  • PostgreSQL 13 : PostgreSQL 13.2よりサポート
  • PostgreSQL 12 : PostgreSQL 12.6よりサポート
  • PostgreSQL 11 : PostgreSQL 11.11よりサポート
  • PostgreSQL 10 : 非サポート
  • PostgreSQL 9.x : 非サポート

追加されたpg_bigm拡張のバージョンは現時点ではVer.1.2となっています。
こちらは将来的に随時更新されていくものと予想されます。

参考:PostgreSQL全般の全文検索について

PostgreSQLにおける全文検索の全般的な参考情報として以下のスライドを貼っておきます。
非常にわかりやすいので参考になると思います。

試してみた

それでは早速試してみます。

0. 検証環境

今回は東京リージョンにPostgreSQL 13.2の環境を作成し検証しました。

あらかじめ用意したVPC環境に「PostreSQL 13.2-R1」のRDSを作成します。
パラメーターグループはデフォルトのままでその他情報は環境に合わせてよしなに構築しています。

データベースへの接続にはpgAdminを使ってます。

1. pg_bigm拡張の確認

まずはRDS作成直後の状態で以下のSQLを実行し利用可能な拡張を検索してみました。

SELECT *
  FROM pg_available_extensions
 WHERE name IN ('pg_bigm', 'pg_trgm')
 ORDER BY name;

プレビュー提供されているpg_trgm Ver.1.5以外にpg_bigm Ver.1.2が利用可能になっていることがわかります。

ちなみにひとつ前のマイナーバージョンであるPostgreSQL 13.1環境だと下図の様な結果となりpg_bigmが利用できません。

(PostgreSQL 13.1環境で利用可能な拡張機能)

2. pg_bigm拡張の有効化

pg_bigmを実際に使うには対象のデータベースで有効にする必要があります。
CREATE EXTENSION文を実行して拡張を有効にします。

CREATE EXTENSION pg_bigm;

有効になった拡張は以下のSQLで確認できます。

SELECT * FROM pg_extension;

ここにpg_bigmが出てくればOKです。

3. 全文検索を試す

ここからはpg_bigmのドキュメントにある例を使って全文検索を試してみます。

データベース内にテスト用のテーブルsample_pg_toolsを作りサンプルデータを投入します。
(ドキュメントではpg_toolsというテーブル名でしたが、システムビューと紛らわしいので名前をちょっと変えています)

CREATE TABLE sample_pg_tools (tool text, description text);

INSERT INTO sample_pg_tools VALUES ('pg_hint_plan', 'PostgreSQLでHINT句を使えるようにするツール');
INSERT INTO sample_pg_tools VALUES ('pg_dbms_stats', 'PostgreSQLの統計情報を固定化するツール');
INSERT INTO sample_pg_tools VALUES ('pg_bigm', 'PostgreSQLで2-gramの全文検索を使えるようにするツール');
INSERT INTO sample_pg_tools VALUES ('pg_trgm', 'PostgreSQLで3-gramの全文検索を使えるようにするツール');

作った結果はこんな感じ。

ここでdescription列に全文検索インデックスを追加してやります。

CREATE INDEX sample_pg_tools_idx ON sample_pg_tools USING gin (description gin_bigm_ops);

作ったインデックスは以下のSQLで確認できます。

SELECT indexname, indexdef
  FROM pg_indexes
 WHERE tablename = 'sample_pg_tools';

これで検索の準備が整いました。

pg_bigmで全文検索するにはLIKE検索で%キーワード%の様に中間一致検索してやればOKです。

SELECT * FROM pg_tools WHERE description LIKE '%全文%';

今回はデータが少ないので結果が分かりにくいですが、実行計画を確認して作成したインデックスでBitmap Index ScanされていればOKです。

(※データ数が少ないとフルスキャンの方が効率的と判断されることがあります。今回はこちらの記事を参考に事前にちょっとデータの水増しをしています)

ちなみに、show_bigm関数を使うと検索対象となる文字の配列を確認することができます。
今回の例だと、

SELECT show_bigm('PostgreSQLで2-gramの全文検索を使えるようにするツール');

"{うに,える,する,で2,にす,の全,よう,るよ,るツ,を使,ツー,""ル "",ール,使え,全文,文検,検索,索を,"" P"",-g,2-,Lで,Po,QL,SQ,am,eS,gr,mの,os,ra,re,st,tg}"

の様に二文字ずつに分解された文字列が検索に使われます。

最後に

以上となります。

単純に検索精度から見ると形態素解析の方が良いのかもしれませんが、導入と利用が非常にお手軽なpg_bigmも使いどころは多いのではないかと思います。
必要に応じてぜひ利用してみてください。