Redmine のリポジトリ全文検索プラグイン

メリークリスマス!でしたね。今年のクリスマスは ruby を書いて過ごしました。えぇ。ついに ruby デビューです。 作ってたのは Redmine のリポジトリ全文検索プラグインです。会社のプロジェクト管理サイトを Trac から乗り換えるにあたり、これ!ってのが見つけられなかった情弱です。
Trac では、full-text サーチエンジンに Hyper Estraier を使う TracRepoSearch という素晴らしいプラグインを使ってました。ということで、便乗して redmine_reposearch というプラグインを作って見ました。バックエンドも同じく Hyper Estraier です。
 個人的に欲しかった機能は、
  • インストールステップが簡単
  • プロジェクト、サブプロジェクト、全プロジェクト間で検索できる
  • Redmine のアクセス権管理に対応する
  • MIME タイプを限定して検索する (今後実装予定)
です。ある程度は満足がいく出来に作ることが出来ました。インストール方法等は wiki にまとめました。わかりにくかったらお気軽に Issue か Twitter でお申し付けください。

# インストールステップは 2 ステップ
これは結構苦労しました。いろんな OSS 検索エンジンの仕様を調べ、一番インストールが簡単で、動作が軽快で、気の利いた ruby バインディングがあるやつを選びました。ライブラリのインストールとプラグインのインストールのみで動作します。
Estraier の DB は RAILS_VAR/reposearch 以下にプロジェクト毎に作成されます。Ubuntu の場合は、 /var/lib/redmine/reposearch になります。クラスタ組みたい場合は、RAILS_VAR はアップロードファイル保存ディレクトリでもあるので、ネットワークファイルシステムをマウントするなどすればいいと思います。
あと SCM との連携は fetch_changesets と同じ仕組を流用しています。まだ ruby script/runner "Repository.fetch_changesets" -e production のようなコマンドでは動きません。 /lib/crawl.rake なるものを作ればイケそうってとこまでは調べました。要望があれば。
インストールじゃなくて、インデックス作成もなるべく軽量になるように考えました。一応最終チェンジセットからの差分のみを再インデックス処理するようにしています。

# プロジェクト、サブプロジェクト、全プロジェクト間で検索できる
これも Hyper Estraier を選んだ理由にもなります。DB をまたいで検索できますし、リポジトリ毎に DB を作成するので、インデックス破損の影響を最小限に抑えることができるかなと。

# Redmine のアクセス管理に対応する
アクセス管理といわず、めんどくさいので使えるものは既存のライブラリを使うようにしました。ページング処理、ワードハイライト、文字コード、SCM の差異吸収、アクセス可能なプロジェクトの選択、プロジェクト選択フィルタなどなど。Redmine code search さまさまです。他に使い回せそうなコードがあれば教えてください先生方。けっこう親和性高くできたと思います。

# MIME タイプ限定検索など今後実装したい機能とか

  • テストを書きたい。書いてません。書き方わかりません。rails とか ruby とか勉強します
  • MIME タイプ限定検索
  • もっと軽量化したい。動作もコード量も
  • マッチパートのシンタックスハイライト (挫折済み)
言い訳を書いておくと、ruby も rails も redmine を初めて触ってるところです。Issue とかで色々教えていただけると喜びます。あと、他のプラットフォームでの動作確認とかも喜びます。

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

Disqus のスケール - Django 編

Disqus のスケール - Django で月間80億PVを処理する