BloGroonga

2015-09-29

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で日本語全文検索をしたいという方はぜひ試してみてください!