PGroonga(ぴーじーるんが) 0.9.0リリース
PostgreSQLからGroongaを使えるようにするPGroongaの0.9.0をリリースしました!
PGroongaについてやPGroongaと他の類似システムとの違いについてはPGroonga 0.2.0のリリースアナウンスを参考にしてください。
0.9.0は0.8.0と互換性があるので、PGroonga用のインデックスを再作成する必要はありません。PGroongaをアップグレードし、接続しなおし、次のSQLを実行すればPGroonga 0.9.0になります。
ALTER EXTENSION pgroonga UPDATE;
PGroongaの速度については次の記事を参考にしてください。
0.9.0での変更点
0.9.0ではjsonb
をサポートしました!
PostgreSQL 9.4からjsonb
型が追加され、GINでインデックスを構築することにより高速にJSONを検索できるようになりました。
PGroongaもjsonb
型に対応しました。GINでインデックスを構築した場合と同様に@>
演算子を使った検索をインデックスを使って高速に実現できます。(@>
演算子では検索条件にjsonb
型の値を指定します。指定したjsonb
を含んでいるレコードがマッチしているかどうかを返すのが@>
演算子です。)
手元でのテストではGINよりPGroongaの方が高速に検索できていました。大量のJSONデータを持っている方は検証をお願いします。
PGroongaもGINも@>
演算子の使い方は同じです。
まず、jsonb
型のカラムがあるテーブルを作ります。
CREATE TABLE logs (
record jsonb
);
インデックスを構築します。
CREATE INDEX logs_index ON logs USING pgroonga (record); -- PGroongaの場合
CREATE INDEX logs_index ON logs USING gin (record); -- GINの場合
データを投入します。
INSERT INTO logs
VALUES ('{
"message": "GET /",
"host": "www.example.com",
"code": 200,
"tags": [
"web",
"example.com"
]
}');
検索します。PGroongaでもGINでも同じです。
SET enable_seqscan = off;
SELECT record FROM logs WHERE record @> '{"host": "www.example.com"}'::jsonb;
@>
演算子についてはドキュメントも参照してください。
PGroongaは@>
演算子だけでなく、@@
演算子もサポートしています。
@>
では指定したJSONがサブセットかどうかしか検索できません。そのため、JSON内の数値を範囲検索したり、文字列を全文検索したりできません。@@
演算子はそのような高度な検索を実現できます。JsQueryを知っているなら、JsQueryのようなものだと思ってもらえればあっています。
JsQueryとの大きな違いはJSON内のすべての文字列に対して全文検索できることです。もちろん、日本語にも対応しています。
次のようにすると、JSON内のどこかにexample.com
が含まれていればヒットします。
SELECT record FROM logs WHERE record @@ 'string @ "example.com"}';
@@
演算子はより高度な検索ができる反面、条件を書くには少しコツがいります。詳細はドキュメントを参照してください。
実装に興味がある方はPGroongaでのJSON検索の実装方法 - ククログ(2015-09-30)を参考にしてください。
おねがい
PGroongaは毎月のリリースを重ねて、性能も使い勝手も向上してきました。記事先頭の方で紹介したベンチマーク結果を見ると実用になる速度がでていることがわかります。
すでに実際に利用している人たちもいます。まだ利用していない人は、ぜひ、自分たちのシステムで実用できるか検討してみてください。PGroongaは既存の優秀な全文検索エンジンGroongaを利用しているため性能は折り紙つきです。(検討結果を広く公開してもらえると他のPostgreSQLユーザーに有益です!)
また、ぜひ、PGroongaのjsonb
対応の性能を検証して結果を公開してください。手元での検証では、インデックス作成時間はPGroongaの方がGINより少し遅く、ディスク使用量は多いです。一方、検索時間はPGroongaの方が少し速いです。
まとめ
最新のPostgreSQLでGroongaを使えるようにするPGroongaの新しいバージョンをリリースしました。PostgreSQLで日本語全文検索をしたいという方はぜひ試してみてください!