Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

groonga(rroonga)を利用したソースコード全文検索エンジン"Milkode"をApache Passengerで軽快に動かす方法

Rubyで書かれたMilkodeというソースコード検索エンジンが巷で評判です。
コマンドラインだけでなく、WEBブラウザから利用出来るインターフェースも用意されています。
これを導入することで、ソースコードを横断検索した結果のURLを、社内チャットなどでやりとりする事も出来ます。

そんなツールを簡単に手元のCentOS環境で構築するテンプレートを作成しました。
milkode-web - Milkode web application bundler template for apache passenger
https://github.com/y-ken/milkode-web

こちらを、ステップバイステップで解説したいと思います。

Milkodeとは

f:id:yoshi-ken:20130430230839p:plain
画像引用元:http://ongaeshi.hatenablog.com/entry/20110730/1312040692

一言で言えば、ソースコードを高速に横断検索できる便利ツールです。
以下の紹介文を読んだとしても、その素晴らしさは正直使ってみないと分かりません。
今回作成した簡単導入キットを利用し、まずは触って試してみて下さい。

Milkodeは行指向の検索エンジンです。 一般的に検索エンジンは「特定の単語を含むファイル」を見つけますが、Milkodeは「特定の単語を含む行」を見つけます。 例えば"def open"で検索すると、一般的な検索エンジンでは"def func()\n.....open....."のようにファイル内に"def"と"open"が含まれるものを全て返しますが、Milkodeの場合は"def open_file()", "def database_open()" といった1行の中に"def", "open"が含まれるものだけをピックアップしてくれます。 一般的にソースコードを検索するためのツール(grepやエディタ附属のものなど)は行指向のものが多いため、それらで培った検索テクニックがそのまま使えます。
http://milkode.ongaeshi.me/wiki/%E7%89%B9%E5%BE%B4

追記:Milkodeのデモサイトがあるようです。
http://kodeworld.ongaeshi.me/

テーマ

公式ドキュメントではmilk webコマンドでWEBサーバを起ち上げる方法が紹介されています。
しかしながら、複数アプリを起ち上げる時など、ApacheのPassenger経由で利用したいこともあるでしょう。
Apache Passengerを利用したMilkodeのWEBアプリを簡単に利用する方法を紹介します。

インストール手順

Milkodeのインストールディレクトリは/var/www/html/を使う場合を想定して説明を進めます。
Apacheがアクセス権を持つディレクトリであればどこでも構いません。

動作確認済み構成

  • Milkode-0.9.9
  • rroonga-2.1.0

ディレクトリ構成

場所 用途
./milkode/data/ rroongaの全文検索データ格納場所
./milkode/source/ 全文検索にインデックスさせる対象のソースコードの格納場所
./milkode/public/ DocumentRoot
./milkode/vendor/bundle/ bundler modules

Step1. Milkodeをテンプレートからbundlerインストール

bundlerを用いるので、システム側のgemを汚しません。

$ cd /var/www/html
$ git clone https://github.com/y-ken/milkode-web.git milkode
$ cd /var/www/html/milkode
$ bundle install --path vendor/bundle

Step2. Milkodeデータベースを初期化する

cd /var/www/html/milkode
$ bundle exec milk init data

Step3. Milkodeデータベースにコンテンツを追加

ここで、何かしらの検索対象としたいソースコード./milkode/source/以下に追加します。

注意
milk addを実行するときは、必ずデータベースディレクトリに移動します。今回のケースでは/var/www/html/milkode/dataに移動します。

# 全文検索にインデックスさせる対象のソースコードの格納場所にいくつかのリポジトリをクローンします
$ cd /var/www/html/milkode/source
$ git clone https://github.com/twitter/bootstrap.git
$ git clone https://github.com/twitter/typeahead.js.git

# Milkodeのデータベースディレクトリへ移動します
$ cd /var/www/html/milkode/data

# Milkodeのデータベースにそれぞれ読み込みます
$ bundle exec milk add ../source/bootstrap/
package    : bootstrap
result     : 1 packages, 146 records, 146 add. (1.25sec)
*milkode*  : 1 packages, 146 records in /var/www/html/milkode/data/db/milkode.db.
$ bundle exec milk add ../source/typeahead.js
package    : typeahead.js
result     : 1 packages, 41 records, 41 add. (0.39sec)
*milkode*  : 2 packages, 187 records in /var/www/html/milkode/data/db/milkode.db.

# 2つ読み込まれた事を確認します
$ bundle exec milk list
bootstrap
typeahead.js
*milkode*  : 2 packages, 187 records in /var/www/html/milkode/data/db/milkode.db.

Step4. Apache設定

以下のような設定をvirtualhosts.conf に追加します。
ServerNameは、独自ドメインを使わないときはIPアドレスなどを設定してください。

$ cat /etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:80>
   ServerName milkode.example.com
   DocumentRoot /var/www/html/milkode/public
   PassengerHighPerformance on
   SetEnv MILKODE_DEFAULT_DIR /var/www/html/milkode/data
</VirtualHost>

その後、Apacheを再起動します。

$ sudo /etc/init.d/httpd restart

Step5. ブラウザで表示確認

それでは、さきほど設定したhttp://milkode.example.com/のようなドメインでアクセスしてみましょう。 以下のような、牛乳瓶のアイコンを用いたMilkodeのロゴが見えれば完成です。

f:id:yoshi-ken:20130501132045p:plain

まとめ

今回はインストールに絞って紹介しました。まずはこの便利さに触れて頂ければと思います。
運用編としては、定期的にインデックスさせる対象にrsyncしたり、インデックス更新を行う定期実行タスクと組み合わせると、より開発の現場で重宝されるのではないでしょうか。