ククログククログRedmineでもっと高速に全文検索する方法Redmineで高速に全文検索する方法で紹介したプラグインの新しいバージョンをリリースしてさらに高速化しました。検索結果のハイライトにPGroonga/Mroongaの機能を使用するようにしました複数キーワードごとに色分けしないようになりましたクエリー構文が使えるようになりました類似チケットの表示をするようにしました類似チケットGroongaの類似文書検索の機能を使って類似チケットを表示するようになりました。あるソフトウェアのサポートをしているときに似た問い合わせが過去にあれば、その似た問い合わせが類似チケットとして表示されることを期待しています。カテゴリなどのメタデータを一切考慮していないので精度はそこそこです。クリアコード社内で運用しているRedmine*1に入れてみたところ類似チケットの検索には15msくらいしかかかっていないのでRedmineの性能に影響はないと考えてデフォルトでONにしてあります。高速化したか元のRedmineの全文検索では、最大で以下の9つのテーブルを検索し、検索時に全件取得してキャッシュしていました。までは既存のコードをなるべく活かしていたので、クエリの実行数は同じで全件取得していたのも同じでした。約1秒かかってしまうことになります。検索対象のレコードを1つのテーブルにまとめてGroongaの機能を直接使用して全文検索のために実行するクエリを1つにしました。使用して一度に取得するレコード数を減らし、Redmineのキャッシュを使用するのをやめました。2.0.1-1redmine_full_text_searchのバージョンはv0.4.0とv0.6.2を使用しました。内部ネットワークからMechanizeで特定のユーザーでログインして表にあるクエリーで検索しました。以下にMariaDB(Mroonga)の場合とPostgreSQL(PGroonga)の場合についてそれぞれの測定結果を示します。データは、以下のメーリングリストのアーカイブを使用しました。メーリングリストごとにプロジェクトを作成しました。メールからチケットを作成し、In-Reply-Toで返信だと判断できる場合は、見つかったチケットへのコメントとして登録するようにしました。これで31142チケットと72392コメントのデータベースを作成しました。v0.6.2向けのテーブルには103537件レコードが存在します。Wikiやドキュメント等チケット以外のデータはありません。ruby-listruby-devgroonga-dev測定結果の単位は全てミリ秒です。60.6336平均と標準偏差は以下の通りです。12.87MariaDBの場合はほぼ想定通りの測定結果でした。プラグインなしの場合は、DBアクセスに初回1500ms以上かかっていたのが2回目は5ms前後になっていてキャッシュが効いています。プラグインv0.4.0の場合は、DBアクセスに初回1000ms前後にかかってており、2回目は5ms前後になっていました。プラグインv0.6.2の場合は、DBアクセスに初回、2回目ともに50-100ms程度かかっており、初回の検索から速いのでキャッシュしなくても十分な速度が出ています。プラグインなしの場合とv0.6.2の場合を比較すると、初回の検索で約24倍高速になっています。db_runtimeの標準偏差を見ると、v0.6.2のとき最も値が小さくなっており、安定して高速に動作することがわかります。143.389平均と標準偏差は以下の通りです。10.96PostgreSQLの場合は、プラグインなしのときは初回、2回目ともにDBアクセスに約5秒かかっているのでキャッシュが効いていないことがわかります。v0.4.0の場合もキャッシュが効いておらず、初回、2回目ともにDBアクセスに約1.5秒かかっています。プラグインなしと比較して、約3倍高速になりました。v0.6.2ではRedmineのキャッシュを使用しないようにしたので、キャッシュの影響はありません。初回、2回目ともにDBアクセスに約0.15秒かかっています。プラグインなしと比較すると、約33倍高速になりました。v0.4.0と比較すると約10倍高速になっています。db_runtimeの標準偏差を見ると、v0.6.2のとき最も値が小さくなっており、安定して高速に動作することがわかります。v0.6.2の場合、MariaDBとPostgreSQLのdb_runtimeの平均を比較するとMariaDBの方が約2.3倍高速という結果でした。これは、MroongaとPGroongaでGroonga上のテーブル定義やインデックス定義に違いがあるためではないかと考えています。まとめ今後は、機能を充実させつつMariaDBとPostgreSQLのどちらを使っても快適に検索できるようにしていきたいです。やりたいことについてはプロジェクトのissuesも見てください。4.0とGFDLのデュアルライセンスで自由に利用できます。クリアコードはプログラミングが楽しいソフトウェア開発者を1名募集しています。クリアコードは「クリアコードをいい感じにする人」を1名募集しています。クリアコードはフリーソフトウェア開発で培った技術力を提供しています。Thunderbird)とRubyとGroonga(全文検索)に関連した開発を得意としています。