PGroongaをインストールしてPostgreSQLの全文検索を高速に実行する
PostgreSQLで全文検索を実現するにはいくつか方法がありますが、PGroongaをインストールして使用する方法がとても高速です。
実際、今仕事で開発しているWEBアプリケーションで、大量のテキストデータを全文検索する必要がでてきました。データベースはPostgreSQLを使っていて、シノニム(同義語)を含めたクエリーを発行するため、多くの類義語をORでつないで検索することになり、スピードが著しく落ちてしまいました。そのため、高速な全文検索はできないかと思い、調査したところPGroongaというのが良さそうということで、早速インストールして使ってみました。
結果はとても良好で、とても快適に検索できるようになりました。私がインストールを行った環境は以下のものです。
インストールした環境とプログラムのバージョン
Cent OS 5.5
PostgreSQL 9.4.5
Groonga 5.1.0
PGroonga 1.0.0
Cent OS 5.5
PostgreSQL 9.4.5
Groonga 5.1.0
PGroonga 1.0.0
以下にPostgreSQLのインストールとPGroongaのインストール、ならびにPGroongaでの全検索の方法をまとめていますのでご参考にしてみてください。
PostgreSQLをインストール
まず最初にPostgreSQLをインストールします。パッケージではなく、ソースからコンパイルしてインストールしています。ここでは、PostgreSQLを/home/test_user/postgres下にインストールしています。
1.PostgreSQL 9.4.5をダウンロードします。PGroongaはPostgreSQL9.3, 9.4に対応しています。
wget https://ftp.postgresql.org/pub/source/v9.4.5/postgresql-9.4.5.tar.gz
2.解凍します。
tar xvfz postgresql-9.4.5.tar.gz
3.ディレクトリ変更します。
cd postgresql-9.4.5
4../configure --prefix=/home/test_user/postgres
5.make
6.make install
7./home/test_user/postgresにPostgreSQL 9.4.5がインストールされます。
8.環境変数の設定
.bash_profileに以下の変数をセットします。
PATH=$PATH:/home/test_user/postgres/bin
export POSTGRES_HOME=/home/test_user/postgres
export PGDATA=$POSTGRES_HOME/data
export PGLIB=$POSTGRES_HOME/lib
export LD_LIBRARY_PATH=$POSTGRES_HOME/lib:/home/test_user/groonga/lib ← これは後で必要になります。
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/test_user/groonga/lib/pkgconfig ← これは後で必要になります。
export POSTGRES_HOME=/home/test_user/postgres
export PGDATA=$POSTGRES_HOME/data
export PGLIB=$POSTGRES_HOME/lib
export LD_LIBRARY_PATH=$POSTGRES_HOME/lib:/home/test_user/groonga/lib ← これは後で必要になります。
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/test_user/groonga/lib/pkgconfig ← これは後で必要になります。
9.source .bash_profile
10.initdb
11.セットアップ完了
Groongaインストール
次にGroongaを/home/test_user/groongaにインストールします。インストールは以下のページを参考にしました。http://groonga.org/ja/docs/install/centos.html#build-from-source (Groonga公式サイト)
1.Groongaをダウンロードします。
wget http://packages.groonga.org/source/groonga/groonga-5.1.0.tar.gz
2.解凍します。
tar xvzf groonga-5.1.0.tar.gz
3.ディレクトリを変更します。
cd groonga-5.1.0
4../configure --prefix=/home/test_user/groonga
5.make -j$(grep '^processor' /proc/cpuinfo | wc -l)
環境を見て最適化しながらインストールを行うので、しばらく時間がかかります。
6.make install
7.インストール完了です。
PGroongaのインストール
最後にPGroongaをインストールします。以下のPGroonga公式サイトを参考にしました。
参考サイト:https://pgroonga.github.io/ja/install/source.html(公式サイト)
1.事前確認
pg_config にパスが通っているかどうかを確認します。pg_confまで入力してタブ・キーを押し、補完されればパスは通っています。
pkg-config --list-allを入力して、groongaが入っているかどうかを確認する。
ソースから/home/test_user以下にインストールする場合はpkg_configには入っていないので、上記のように.bash_profileに環境変数をセットしておく必要があります。
2.PGroongaをダウンロードします。
wget http://packages.groonga.org/source/pgroonga/pgroonga-1.0.0.tar.gz
3.ディレクトリを移動します。
cd pgroonga-1.0.0
4.PGroongaをビルドします。
make
5.make install
インストール完了です。
データベース作成
引き続いてデータベースを作成します。
1.pgroonga_testという名前のデータベースを作成します。
psql --command 'CREATE DATABASE pgroonga_test'
2.CREATE EXTENSION pgroongaの実行
psql -d pgroonga_test --command 'CREATE EXTENSION pgroonga;'
これを実行したときにundefined symbolとか出ましたが、LD_LIBRARY_PATHをいじってデータベースを再起動したら直りました。上に書いたものが正常に動いたLD_LIBRARY_PATHになります。
インデックス作成
PGroongaでデータベースを作成することができたら、いよいよテーブルを作ってデータを登録していきます。テーブルを作る際にはPGroongaで高速に検索できるインデックスを張っておきます。
text型のカラムを全文検索させたかったので、次のようなインデックスを作成しました。
CREATE INDEX ${INDEX_NAME} ON ${TABLE_NAME} USING pgroonga (${COLUMN});
たとえば、次のようなテーブルがあるとします。
CREATE TABLE memos (
id integer,
content text
);
id integer,
content text
);
pgroongaでのインデックスは主に2つあります。
1.tokenizerを指定しない
CREATE INDEX pgroonga_content_index
ON memos
USING pgroonga (content);
ON memos
USING pgroonga (content);
2.tokenizerを指定する
CREATE INDEX pgroonga_content_index
ON memos
USING pgroonga (content)
WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit');
ON memos
USING pgroonga (content)
WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit');
1と2の違いは、tokenizerを指定している点にあります。1の場合はtokenizerを指定していません。1はキーワードがアルファベットの場合、部分一致での検索に対応していません。2でtokenizerを指定すると、アルファベットでも部分一致が有効になります。
たとえば、memosテーブルのcontentsカラムに、PostgreSQLという言葉が入っていて、sqlで検索すると、1の場合はヒットせず、2だとヒットするということになります。前方一致でpostgresで検索すると1も2も両方ヒットします。
どのような検索をするかによって、tokenizerの指定をする必要があります。
参考ページ:https://pgroonga.github.io/ja/reference/create-index-using-pgroonga.html
全文検索
インデックスを作成した後は、とても簡単なSQLで高速な全文検索を実行できます。例として挙げると、
1.column LIKE '%キーワード%'
2.column @@ 'キーワード'
という方法があります。1の方法は、これまで通りlikeやilikeを使ってPGroongaの全文検索が実行できるのがうれしいところです。既存のSQLを変更する必要がありません。ただ、この場合は通常のlike演算子よりも速いそうですが、2のやり方よりは遅くなるそうです。
もしlikeでスピードが出ないということであれば、@@演算子を使った方法に変えた方が良さそうです。結局私は2番目の方法に変更しました。
全文検索の方法はチュートリアルのページに詳しく記載されているので、参考にしてみてください。
参考:https://pgroonga.github.io/ja/tutorial/