前回に引き続き、PostgreSQLに日本語中間一致検索でインデックスを使えるようにしていく。今回は、pg_bigm の出番である。pg_trgmとは違って日本語中間一致検索のために作られているモジュールなのでとても期待できる。ただ、2013年4月5日リリースのpg_bigm20130405はPostgreSQL9.1 で動作確認が行われており「9.2以降には対応していると思われますが、動作確認していません。」言うのが開発者の公式見解である。当環境は9.2だが私の自己責任においてインストールしてみようと思う。
pg_bigmのインストール
1.pg_bigmのダウンロード
まずは、pg_bigmをプロジェクトサイトのリンクからダウンロードしてくる。
# wget http://jaist.dl.sourceforge.jp/pgbigm/58505/pg_bigm-20130405.tar.gz
~省略~
#
# tar -xvf ./pg_bigm-20130405.tar.gz
pg_bigm-20130405/
pg_bigm-20130405/LICENSE
pg_bigm-20130405/Makefile
pg_bigm-20130405/bigm.h
pg_bigm-20130405/bigm_gin.c
pg_bigm-20130405/bigm_op.c
pg_bigm-20130405/html/
pg_bigm-20130405/html/index.html
pg_bigm-20130405/html/pg_bigm.html
pg_bigm-20130405/html/style.css
pg_bigm-20130405/pg_bigm--1.0.sql
pg_bigm-20130405/pg_bigm.control
#
#
2.pg_bigmのメイクとインストール
解凍展開したソースをメイクしてインストールする。make コマンドの PG_CONFIG オプションには、pg_configへのパスを指定する。pg_configにパスが通っている環境でこのコマンドを実行する場合は、PG_CONFIG オプションは必要ない。
# make USE_PGXS=1 PG_CONFIG=/usr/pgsql-9.2/bin/pg_config
gcc -O2 -g -I/usr/include/et -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fpic -I. -I. -I/usr/pgsql-9.2/include/server -I/usr/pgsql-9.2/include/internal -I/usr/include/et -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include -c -o bigm_op.o bigm_op.c
gcc -O2 -g -I/usr/include/et -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fpic -I. -I. -I/usr/pgsql-9.2/include/server -I/usr/pgsql-9.2/include/internal -I/usr/include/et -D_GNU_SOURCE -I/usr/include/libxml2 -I/usr/include -c -o bigm_gin.o bigm_gin.c
gcc -O2 -g -I/usr/include/et -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fpic -shared -o pg_bigm.so bigm_op.o bigm_gin.o -L/usr/pgsql-9.2/lib -L/usr/lib64 -Wl,--as-needed
#
# make USE_PGXS=1 PG_CONFIG=/usr/pgsql-9.2/bin/pg_config installl
/bin/mkdir -p '/usr/pgsql-9.2/lib'
/bin/mkdir -p '/usr/pgsql-9.2/share/extension'
/bin/mkdir -p '/usr/pgsql-9.2/share/extension'
/bin/sh /usr/pgsql-9.2/lib/pgxs/src/makefiles/../../config/install-sh -c -m 755 pg_bigm.so '/usr/pgsql-9.2/lib/pg_bigm.so'
/bin/sh /usr/pgsql-9.2/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./pg_bigm.control '/usr/pgsql-9.2/share/extension/'
/bin/sh /usr/pgsql-9.2/lib/pgxs/src/makefiles/../../config/install-sh -c -m 644 ./pg_bigm--1.0.sql '/usr/pgsql-9.2/share/extension/'
#
3.PostgreSQLへの設定追加
PostgreSQLの設定ファイルに shared_preload_libraries とcustom_variable_classes を追加するように公式ドキュメントには記載があるが、custom_variable_classes は9.2では廃止されており、configファイル追加するとPostgreSQLの起動に失敗してしまう。
# cd /var/lib/pgsql/9.2/data/
# cp -p postgresql.conf postgresql.conf.bk
# vi postgresql.conf
~省略~
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------
# Add settings for extensions here
shared_preload_libraries = 'pg_bigm'# pg_bigm japanese all text search ← 追加
#custom_variable_classes = 'pg_bigm' ← 9.2以降は不要なのでコメントアウトしています。
#
# /etc/init.d/postgresql-9.2 restart
postgresql-9.2 サービスを停止中: [ OK ]
postgresql-9.2 サービスを開始中: [ OK ]
#
#
4.pg_bigmをDBへ追加
DBの拡張機能へ追加してginインデックスを追加することで全文検索が高速になる。
# psql -d testdb
パスワード:
psql (9.2.4)
"help" でヘルプを表示します.
testdb=#
testdb=# CREAT EXPTENSION pg_bigm SCHEMA testsc;
CREATE EXTENSION
testdb=#
testdb=# \dx
インストール済みの拡張の一覧
名前 | バージョン | スキーマ | 説明
---------+------------+------------+------------------------------
plpgsql | 1.0 | testsc | PL/pgSQL procedural language
(1 行)
testdb=#
testdb=#
この状態で、検索したいテーブルのカラムにGINインデックスを作ると、日本語の中間一致検索でもインデックスが使えるようになる。ちなみに、CREATE EXPTENSION コマンドで pg_bigm の代わりに pg_trgm を指定すれば前回有効化したpg_trgm を使うこともできる。だが、pg_bigm と pg_trgm は同時にDBに追加することはできない。DBごとにどちらか一つにしておかなければならない。ともあれ、これでソースコードにLIKEで %ほにゃらら%というような指定が遠慮なくできる。良きかな。良きかな。