BloGroonga

2016-11-30

PostgreSQL用高速日本語全文検索モジュールPGroonga(ぴーじーるんが) 1.1.9リリース

PostgreSQLで高速日本語全文検索をできるようにするPGroongaの1.1.9をリリースしました!

新規ユーザーの方は、PGroonga 1.0.0のリリースアナウンスのPGroongaについても参照してください。

ベンチマーク

公式サイトにWikipediaのデータを使ったベンチマークを追加しました。

比較対象は以下の3つのモジュールです。

  • PostgreSQL組み込みのtextsearch
  • contribにあるpg_trgm
  • サードパーティーの拡張モジュールpg_bigm

textsearchとpg_trgmは日本語をサポートしていないので英語版のWikipediaのデータを使っています。

pg_bigmは日本語をサポートしているで日本語版のWikipediaのデータを使っています。

PGroongaとtextsearchとpg_trgm

PGroongaとtextsearchとpg_trgmのベンチマーク結果の概要を説明します。より詳細な内容はPGroonga対textsearch対pg_trgmを参照してください。

まず検索時間です。

次のようにpg_trgmがPGroongaとtextsearchと比べて圧倒的に遅かったです。(棒の長さは検索時間(ms)を表しているので短い方が高速です。)

PGroongaとtextsearchとpg_trgmの検索時間

pg_trgmを抜くと次のようになります。PGroongaとtextsearchがほぼ同じくらいの速さということがわかります。なお、「Groonga」というのはpgroonga.command関数を使ってGroongaを直接使って検索したケースです。PGroonga・textsearchと比べて10倍以上高速です。

PGroongaとGroongaとtextsearchの検索時間

次にインデックス作成時間です。

次のようにPGroongaが一番高速です。textsearchより2倍ほど速く、pg_trgmより30%ほど速いです。

PGroongaとtextsearchとpg_trgmのインデックス作成時間

PGroongaとpg_bigm

PGroongaとpg_bigmのベンチマーク結果の概要を説明します。より詳細な内容はPGroonga対pg_bigmを参照してください。

まず検索時間です。

次のように検索語が3文字以上のときはpg_bigmはPGroongaと比べて圧倒的に遅かったです。(棒の長さは検索時間(ms)を表しているので短い方が高速です。)

PGroongaとpg_bigmの検索時間

次にインデックス作成時間です。

次のようにPGroongaがpg_bigmより75%ほど速いです。

PGroongaとpg_bigmのインデックス作成時間

変更点

1.1.3からの変更点は次の通りです。UPDATE/DELETEをすると検索漏れが発生する可能性がある問題を修正しているためアップグレードをオススメします。ストリーミングレプリケーション対応やZstandardによる圧縮のサポートなど多くの改良もあるため、その観点でもアップグレードをオススメします。それぞれの項目の詳細はリンク先を確認してください。

  • [実験的] WALをサポートしました。クラッシュセーフではありませんが、レプリケーションができるようになりました。PostgreSQL 9.6以降とMessagePackが必要です。
  • [Windows] バンドルしているGroongaのバージョンを6.1.1にしました。
  • [Windows] PostgreSQL 9.5.5用のパッケージと9.6.1用のパッケージを両方提供するようにしました。
  • インデックス対象のテーブルに対してUPDATEあるいはDELETEをした後、検索できないレコードがでることがある問題を修正しました。(yongxianggao-chanjetさんが報告)
  • pgroonga.score関数のメモリーリークを修正しました。(高橋さんが報告)
  • デフォルトテーブルスペース以外のテーブルスペースにPGroongaのインデックスを作成するとVACUUM時に削除される問題を修正しました。(yongxianggao-chanjetさんが報告)
  • テーブルスペースをサポートしました。
  • サイズの大きなレコードがある場合はインデックスオンリースキャンを無効にするようにしました。
  • [Ubuntu] Wily Werewolf(15.10)のサポートをやめました。
  • [Ubuntu] Yakkety Yak(16.10)のサポートを始めました。
  • Zstandardを使ったテキストデータの圧縮をサポートしました。
  • zlibを使ったテキストデータの圧縮をサポートしました。
  • 起動時にログにPGroongaのバージョンを出力するようにしました。
  • pgroonga_tuple_is_alive Groonga関数を追加しました。groonga.command関数と一緒に使うとPostgreSQLレベルで無効なレコードを除去できます。
  • CREATE INDEX時のメモリー使用量を減らしました。
  • クラッシュ時にバックトレースをログに残すようにしました。(Windowsでは動きません。)
  • ログにPIDを出力するようにしました。
  • 定数を引数として以下の関数を実行したときに最適化されるようにしました。
  • pgroonga.escape関数を追加しました。スクリプト構文の値をエスケープする関数です。
  • pgroonga.query_escape関数を追加しました。クエリー構文の値をエスケープする関数です。
  • pgroonga.command_escape_escape関数を追加しました。Groongaコマンドの引数の値をエスケープする関数です。
  • pgroonga.table_name関数の戻り値の型をcstringからtextに変更しました。
  • pgroonga.command関数でコマンドの引数を配列で指定できるようにしました。引数の値を自動的にエスケープするためセキュリティー向上につながります。そのためこの使い方を推奨します。
  • クエリーログを出力できるようにしました。pgroonga.query_log_pathパラメーターで出力の場所、出力するかどうかを制御できます。

アップグレード方法

1.1.3以降のすべてのバージョンと互換性があります。アップグレードの「互換性がある場合」用の手順でアップグレードしてください。

おしらせ

PGConf.ASIA 2016 DAY 2(2016年12月3日(土))の14:00からPGroongaのセッションがあります。PGroongaと他のモジュールの比較だけでなく、PostgreSQL 9.6から追加されたgeneric WAL APIを用いたレプリケーションの実現方法なども解説する予定です。セッションで使うスライドは以下で公開しています。PGroongaに興味のある方はぜひお越しください。

まとめ

PGroongaの新しいリリースを紹介しました。レプリケーションにも対応してどんどん使いやすくなっています。

PostgreSQLで高速に日本語全文検索をしたいという方はPGroongaを使ってガンガン検索してください!