BloGroonga

2015-10-29

PGroonga(ぴーじーるんが) 1.0.0リリース

今日は肉の日ですね!

PostgreSQLからGroongaを使えるようにするPGroongaの1.0.0をリリースしました!最初のメジャーリリースです!

PGroongaについて

PGroongaはPostgreSQLを高速に日本語全文検索可能なシステムに拡張する魔法のような拡張機能です。PGroongaの他にも類似の拡張機能はありますが、速度・機能面で他の拡張機能とは一線を画しています。これはPGroongaはバックエンドにGroongaという本格的な全文検索エンジンを使っているためです。

速度面では類似の拡張機能であるpg_bigmよりも高速です。インデックス作成時間、検索時間ともに数倍から10倍以上高速です。

PostgreSQLで日本語全文検索 - LIKEとpg_bigmとPGroonga - ククログ(2015-05-25)に日本語版Wikipediaのデータを使って計測した結果があります。

まずはインデックス作成にかかった時間です。

拡張機能 インデックス作成時間
PGroonga 25分37秒
pg_bigm 5時間56分15秒

このケースでは約14倍高速です。

検索時間は次の通りです。

検索語 ヒット数 PGroongaの検索時間 pg_bigmの検索時間
「PostgreSQL」または「MySQL」 368 0.030s 0.107s
データベース 17172 0.121s 1.224s
テレビアニメ 22885 0.179s 2.472s
日本 625792 0.646s 0.556s

「日本」で検索した場合はpg_bigmの方がやや速い(*)ですがそれ以外の場合ではPGroongaの方が3倍から14倍ほど高速です。どのような検索語に対しても安定して高い性能を出していると言えます。

(*) pg_bigmは3文字以上の検索語より2文字以下の検索語の方が得意です。

機能面では他の類似拡張機能にはない次の機能を提供しています。

  • ノーマライズ機能
  • トークナイザーのカスタマイズ機能
  • スニペット機能

ノーマライズ機能とは異なる表記のテキストを同等の表記のテキストに統一する処理です。

簡単なものでは「ポスグレ」というようにいわゆる半角カタカナで書かれたテキストも「ポスグレ」もどちらも「ポスグレ」というようにいわゆる全角カタカナに統一します。こうすることにより「ポスグレ」(全角カタカナ)で検索しても「ポスグレ」(半角カタカナ)で書かれたテキストでもヒットするようになります。

難しいものだと「㍊」は「ミリバール」に変換します。これらはUnicodeのNFKCという方法をベースにしています。

トークナイザーのカスタマイズ機能とは検索キーワードとなるキーワードを抽出する処理(トークナイズ処理)をカスタマイズできる機能です。抽出処理をカスタマイズすることにより、検索精度・検索性能のトレードオフをユーザーがコントロールできるようになります。

たとえば、「形態素解析器を使ったトークナイザー」というものにすれば精度・性能は向上しますが、検索漏れが発生することがあります。なお、他の類似拡張機能で形態素解析器を使ったトークナイズ処理をできるものはありません。PGroongaだけです。

「形態素解析器を使ったトークナイザー」にはMeCab(OSS)を使ったものとJMAT(非OSSの商用製品)を使ったものがあります。バックエンドで使っているGroongaはトークナイザーをプラグインとして追加できる機能を提供しているため様々なプロダクトを活用してトークナイザーを実装できるのです。

スニペット機能とはWeb検索エンジンがよく使っている機能でキーワード周辺のテキストを表示しているものです。Googleもヒットしたページのタイトルの下にキーワード周辺のテキストを出していますよね。それのことです。PGroongaはそれを実現する関数を提供しています。

他にも次の機能を提供しています。

  • Web検索エンジンが使っているようなクエリー言語
  • JSON検索
    • 個々の要素も検索できますし、JSON内のすべてのテキストに対して全文検索することもできます。

現在は未実装ですが、今後、提供予定の機能には次のような機能があります。これらはGroongaでは実装されている機能です。

  • クエリー展開機能
  • 重み付け指定機能
  • ステミング機能

使い方

PGroongaは全文検索のことをあまり知らなくても簡単に使えます。インデックスを作成してWHEREに条件を指定するだけです。

CREATE INDEX index_name ON table USING pgroonga (column);

SELECT * FROM table WHERE column @@ '全文検索';

LIKEでもインデックスを使って検索できる機能を提供しているため、既存アプリケーションで次のように書いていたとしてもアプリケーションを変更せずに高速にできます。

SELECT * FROM table WHERE column LIKE '%全文検索%';

興味がでてきましたか?インストールしてチュートリアルを試してみてください。一通りの機能を確認できます。

インストールも簡単です。主要なプラットフォーム用にパッケージを提供しているからです。Windows用のバイナリーも提供しています。

おしらせ

1ヶ月後の2015年11月29日にPGroongaのイベントを開催します。PGroongaに興味がでてきた方はぜひお越しください。

会場および懇親会の飲食物をぐるなびさんに提供してもらえることになりました。そのため、無料で懇親会まで参加でき、PGroongaの情報、他のユーザーがどのように使っているかの情報などを得ることができるイベントになっています。

PGroongaの実装に興味のある方は↑の2日前の11月27日に開催されるPostgreSQLカンファレンス2015へお越しください。開発者が「PGroongaの実装」というタイトルで発表します。

PGroongaだけでなく全文検索についても興味がある方は来週の11月6日に開催の「Groongaで学ぶ全文検索」への参加もご検討ください。「Groongaで学ぶ全文検索」は予習・復習なしで全文検索を学ぶ、参加者に合わせて内容を決める、という限られた時間内でできるだけ実りある時間にしようというスタイルの勉強会です。全文検索を学びたい!という方はご活用ください。

既存ユーザー向け情報

ここまではPGroongaを知らない人向けに書いてきましたが、このセクションだけは既存ユーザー向けの情報になります。

アップグレード方法

1.0.0は過去のバージョンと互換性がありません。アップグレードの「非互換の場合」用の手順でアップグレードしてください。

1.0.0での変更点

0.9.0から1.0.0での変更点は次の通りです。

  • インデックスオンリースキャンをサポートしました。
  • インデックスを使った場合でも使わない場合でもLIKEが同じ結果を返すようになりました。その代わり速度は遅くなっています。ヒット数が多くなるほど遅くなる傾向があります。(PostgreSQLが提供するRecheck機能を使っているため。)
  • ILIKEをサポートしました。
  • 正規表現を使った検索をサポートしました。
  • Winodws用のバイナリーにMeCabをバンドルするようにしました。

イベント発表のおねがい

1ヶ月後の2015年11月29日に開催するPGroongaのイベントでは「PGroongaを使っていてよかったこと」というテーマで発表者を募集しています。PGroongaを使っていて助かった・役立っているという方はぜひこの機会に教えてください。他のユーザーの参考にもなりますし、なにより開発者の励みになります。PGroongaの開発が活発に続くとうれしいという方はぜひご協力ください。

詳細は次のページを参照してください。

まとめ

最新のPostgreSQLでGroongaを使えるようにするPGroongaの新しいバージョンをリリースしました。はじめてのメジャーリリースです。PostgreSQLで日本語全文検索をしたいという方はぜひ試してみてください!