30秒でHerokuにソースコード検索をデプロイできる Milkode on Heroku を作りました。

HerokuでRroongaが使えるようになったので、これはMilkodeもHerokuにデプロイ出来るのではないかと思いチャレンジしてみました。

f:id:tuto0621:20140615140636p:plain

インストール

ongaeshi/milkode-on-heroku

用法

気になるソースコードを意味のある固まり(例えばある言語とプラグインや、アプリとその内部で使われているライブラリなど)でまとめておき、検索出来るようにしておくとなかなか便利です。

RubyとGo言語を組み合わせて高速なgrepを作りました

Milkode 1.7で新しく入ったGomilkの技術解説です。ここ数ヶ月Go言語の勉強をしていましたが、Rubyで書かれたMilkodeとのよい組み合わせを思いつき、一ヶ月ほどかけて作ってみました。

Gmilkの問題

MilkodeにはGmilkというGrep感覚で使えるコマンドラインツールが付属しているのですがもう少し高速に検索したいという欲求がずっとありました。

Gmilkが遅い原因としては

  • 関連するライブラリがたくさんあってアプリケーションの起動が遅い
  • 検索候補のファイル一覧を回すループ処理が遅い

というのが主な理由でした。

これらの問題を解決するために新しいプログラムを書きました。 名前はGo言語で作るのでGomilkとしました(偶然ゴロがよかった)。

作戦

以下のような作戦で高速化を図りました。

  1. あらかじめWebアプリを立ち上げておく
  2. Gomilkを実行
  3. Gomilkは引数から検索クエリを作ってhttp経由でWebアプリに渡す
  4. Webアプリはもらったクエリーを元にGroongaで全文検索して検索候補のファイル一覧を返す
  5. 受け取ったファイル一覧を元にGomilk側でファイル内容の検索を行う

実際の処理と照らし合わせると以下のようになります。

1. あらかじめWebアプリを立ち上げておく

$ milk web -g

2. Gomilkを実行

$ gomilk test

3. Gomilkは引数から検索クエリを作りhttp通信経由でWebアプリに渡す

GET http://127.0.0.1:9292/gomilk?dir=%2Fpath%2Fto%2Fdir&query=test

4. Webアプリはもらったクエリーを元にGroongaで全文検索して検索候補のファイル一覧を返す

/path/to/dir/Gemfile
/path/to/dir/app.rb

5. 受け取ったファイル一覧を元にGomilk側でファイル内容の検索を行う

`path/to/dir/Gemfile`の中から`test`を探す・・
`/path/to/dir/app.rb`の中から`test`を探す・・

主要ライブラリの初期化処理はあらかじめWebアプリ側で済ませておくことでアプリケーションの起動時間の短縮化につながります。

2, 3, 5に相当するhttp通信とファイル一覧を元にした検索処理はGo言語で書きます(ここがGomilk)。バイナリに変換出来るのでプログラムの基本速度自体が高速になり、並列処理を使って複数のファイルを同時に検索することも可能になります。ファイル一覧を回すループはずいぶんと高速になるはずです。

Groongaとの通信やwebアプリ自体の制御はすでにRubyで書かれているものを再利用出来るためGoで書き直す量を最小限に絞ることも出来ました。(割と重要)

結果

OSX 10.7.5, Core2 Duo 3.06 GHz, 8 GB RAM, 500GB HDD.

それぞれのルートディレクトリから"performance test"を検索しました。(例: grep -r "performance test")

Ruby-2.1.2 (4722 files)

検索1回目(sec) 2回目以降(sec)
grep 2.14 (-r) 11.510 0.191
ag 0.22 pre 7.024 0.159
Gmilk 1.7.0 10.783 2.198
Gomilk 0.1 4.110 0.228

linux-3.10-rc4 (45752 files)

検索1回目(sec) 2回目以降(sec)
grep 2.14 (-r) 40.135 1.747
ag 0.22 pre 35.923 1.459
Gmilk 1.7.0 ※3.196 2.315
Gomilk 0.1 11.400 0.539
  • (おそらく)ファイル内容がHDDのキャッシュに載っているかどうかで検索速度が変わるため、1回目と2回目以降で分けて計測しました
  • HDDのキャッシュクリアはマシンを再起動すれば多分クリアされるだろう、という前提で行っています。
  • ※について : よく理由が分からなかったのですが妙に早かったです・・。Rubyを検索した後にLinuxを検索してデータを取っていたためGroongaデータベースの内容が事前にキャッシュされ高速になったのかもしれません。(でもそれならGomilkももっと早くなっていいよなぁ)

特にキャッシュに載る前の最初の検索において、全てのファイルの中身を調べる必要のあるgrepやagと比べて、全文検索エンジンであらかじめ検索対象を絞り込めるGmilk, Gomilk の方が有利な印象です。

Gomilkはag等の高速なgrepと比べても安定してよいパフォーマンスを出せている事が分かります。Gmilkと比べると圧倒的に高速です。ファイル数が増えてくるとGroongaで事前に絞り込めるためGomilkの効率はさらに良くなります。

milk web 側の実装

milk web-g オプションを付けた時に GET /gomilk を受け取れるようにします。例えば検索ディレクリ: /path/to/dir検索文字列: testの場合は以下のようなURLを受け付けます。

GET http://127.0.0.1:9292/gomilk?dir=%2Fpath%2Fto%2Fdir&query=test

受け取ったWebアプリはディレクトリと検索文字列を使ってGroongaデータベースを検索します。検索結果のファイル一覧をテキスト形式で返します。

/path/to/dir/Gemfile
/path/to/dir/app.rb

後はGomilk側にお任せです。

f:id:tuto0621:20140607152915p:plain

GET /gmilk の結果例。検索候補となるファイル一覧が表示される。

Gomilkの実装

pt(monochromegane/the_platinum_searcher)のコードを大分参考にしました。というかptが無かったらGomilkを作る気にもならなかったと思います。枕に足を向けて寝られません。

私の場合はよく検索するコード群はMilkodeに登録してgomilkで検索し、それ以外はptを使って検索するように使い分けています。ptはWindows版があるのと日本語ファイルに強いのが嬉しい所です。

Gomilkが独自に実装した部分としては、ptがディレクトリ内を検索してファイルリストを作る部分を、http経由でmilk webと通信する処理に置き換えたことです。

まとめ

RubyとGoの組み合わせが上手くいって満足する検索スピードを得ることが出来ました。

私自身は今後は主にGomilkを使っていきますがGmilkも引き続きメンテナンスを続ける予定です。Rubyだけで動かせるGmilkの手軽さはやはり便利です。またGomilkやGmilkの最大のメリットは「いちいち検索先ディレクトリを指定しないで検索出来る」ことだと思っていて、agやgrepが高速でもGomilkを使えない環境であれば、Gmilkを使う価値は充分にあると思っています。

既存のアプリケーションをWebアプリとしてあらかじめ立ち上げておく事で、全てをGo言語に置き換える必要が無くなる、というのは色々と使えるアプローチではないかと思いました。

前も似たようなことを書いた気がしますがGo言語とRubyのようなLL言語の相性はとてもよいと思っていて、まずはRubyでさくさくと作り、後で速度が必要になってきた部分をGo言語で置き換えていくとなかなかいいです。Webアプリ等のバックエンドを置き換える例はすでに色々な所で紹介されていますが、Gomilkの場合はフロントエンドを置き換える一つの例になったのではないでしょうか。

Gomilkは「検索先ディレクトリの指定が不要で、かつgrepやagよりも高速に検索出来る」私にとって理想のツールになりました、是非一度お試し下さい。まだ出来たばかりなので随時機能は追加していく予定です。

Milkode 1.7 をリリース - gomilk

  • Go言語で作ったgmilkの高速版、gomilkに対応
  • gmilk --expand-path に対応
  • README, ヘルプの国際化強化

インストール

$ gem install milkode

ダウンロード, Gems

Go言語で作ったgmilkの高速版、gomilkに対応

ongaeshi/gomilk

Go言語で書かれた高速なgmilkです。

Rubyで書かれたWebアプリと通信して(Groongaを使って)検索候補となるファイルを見つけ出し、Go言語でファイル内検索するのでめちゃ早いです。

試しにRubyソースコード全体(4722 files)から検索すると0.2秒位で結果が返ってきます。Linux(45752 files)でも0.5秒位でした。- 詳しく

ファイル内検索部分は monochromegane/the_platinum_searcher を大分参考にさせて頂きました。私の場合はよく検索するコード群はMilkodeに登録してgomilkで検索し、それ以外はptを使って検索するように使い分けています。

簡単な使い方

  1. gomilkのバイナリをダウンロードして(またはソースからgo build)、PATHの通った場所に置きます。
  2. mil web -gでWebアプリを起動します
  3. 後はgmilkと同じように使って下さい。
# 現在パッケージで検索
$ gomilk search_keyword

# 全体パッケージで検索
$ gomilk -a search_keyword

詳しくはongaeshi/gomilkをどうぞ。

emacs-milkodeで使う時は--nogroup --nocolor --smart-caseオプションを追加するといいです。

gmilk --expand-path に対応

gmilkでの検索結果のファイルのパス · Issue #66 · ongaeshi/milkode

README, ヘルプの国際化強化

READMEに基本的な使い方を(英語で)追加しました。 英語版のヘルプも書きました。これでWebアプリで日本語しか無い所は無くなったはず・・。

リリースノート

  • milk web

  • gmilk

    • gmilkでの検索結果のファイルのパス (thanks kazuna)
  • etc

    • Improve README
    • Add a badge of gem version
    • Change the setting of TravisCI [groonga-dev,02268]
    • Change to Bundler a method of generating a gem
      • Jeweler, Thanks for long support

関連記事

Milkode 1.6.1 をリリースしました

1.5の時に告知するのを忘れていました。まとめてご連絡です。

  • トップページをリニューアル、タイムラインスタイルに (1.5)
  • 環境変数 GMILK_OPTIONS のサポート
  • gmilk で Ctrl+C 押下時にスタックトレースを表示しないように
  • 安定化

インストール

$ gem install milkode

ダウンロード, Gems

トップページをリニューアル、タイムラインスタイルに

f:id:tuto0621:20140418002105p:plain

最近追加やアップデートされたパッケージを見つけやすくなりました。

環境変数 GMILK_OPTIONS のサポート

GREP_OPTIONS的なやつです。

$ export GMILK_OPTIONS="-o sjis"

で常にsjisで出力されるようになります。

gmilk で Ctrl+C 押下時にスタックトレースを表示しないように

gmilk で Ctrl+C 押下時のスタックトレースを表示しないで欲しい · Issue #61

gmilk実行中にCtrl+Cを押しても変なスタックトレースが出ないようになりました。

安定化

色々直しました。

リリースノート

  • milk web
    • トップページをリニューアル
      • タイムラインスタイルに変更
  • milk
    • 57 Use "rescue Error::EACCESS" instead of FileTest.readable? for Windows (thanks kazuna)
    • 58 Use whichr in Util.exist_command? (thanks kazuna)
    • 65 Add FileTest.readable? (thanks kazuna)
  • gmilk
    • 61 Without displaying stacktrace when pressed Ctrl+C on gmilk (thanks msmhrt)
    • Support ENV['GMILK_OPTIONS']
  • etc
    • 64 thin < 2.0.0 in Gemfile (thanks MaskedW)
    • Add TravisCI Button
    • README.rdoc -> README.md
    • Util::func -> Util.func
    • Rewrite summary and description

おまけ

るびまに寄稿しました。

関連記事

数万の電子書籍から目的のページを一瞬で見つけ出す、Honyomi

続きを書きました。

honyomi.gif

ongaeshi/honyomi

Honyomiは個人やイントラネット環境で使える電子書籍(pdf)の検索エンジンとWebアプリです。手元にある大量のpdfをコマンドラインから登録し、ブラウザ経由で簡単に検索することが出来ます。

HonyomiはMilkode電子書籍版ともいえます。使い方も似ているため、Milkodeを使ったことのある人はよりスムーズに使えるのではないかと思います。

作った経緯

紙の本も好きなのですが、電子書籍で購入したり、本棚整理時に自炊することが増えてきました。

で、ふとあの時に読んだあれはどこにあったっけ、となっても見つけられないことが何度か起きました。紙の本であれば背表紙から本を探してぱらぱらとめくって見つけることが出来るのだけど、ファイル名だけどなんとなく勘が働かない・・。やはりデジタルデータは検索エンジンから検索出来るようにするのがよさそうだと思い、作ってみました。

手元に大量の電子書籍を持っている方は是非使ってみて下さい。いつでも過去に読んだ本を検索で読み返せるようになると読書体験が一段階パワーアップするかもしれません。

社内文書がpdfで配布されているような環境でも便利に使えるのではないかと思います。

インストール

$ gem install honyomi

Rroongaのインストールに失敗する場合はこちらを参考にして下さい。

また、それ以外に以下のツールが必要です

  • pdftotext - pdfの読み込みに使います (poppler, xpdf)

使い方

データベースの作成

$ honyomi init
Create database to "/home/username/.honyomi/db/honyomi.db"

データベースを指定 (環境変数HONYOMI_DATABASE_DIRを設定、他のコマンドでも同様に動作します)

$ HONYOMI_DATABASE_DIR=/path/to/dir honyomi init
Create database to "/path/to/dir/db/honyomi.db"

本の追加

$ honyomi add /path/to/this_is_book.pdf
A 1 this_is_book (10 pages)

本の編集

idを指定してタイトルを変更します。

$ honyomi edit 1 -t "This is Book"
id:        1
title:     This is Book
path:      /path/to/this_is_book.pdf
pages:     10
timestamp: 2013-01-01 00:00:00

本を一覧

$ honyomi list
1 This is Book (10 pages)
2 That is Book (20 pages)

idを指定して詳細を表示します。

$ honyomi list 1
id:        1
title:     This is Book
path:      /path/to/this_is_book.pdf
pages:     10
timestamp: 2013-01-01 00:00:00

コマンドラインから検索

$ honyomi search bbb
1 matches
--- This is Book (5 page) ---
aaa <<bbb>> ccc

Webアプリを起動

$ honyomi web
  • AND, OR, NOT検索
  • Filter+, -による絞り込み
  • Downloadでダウンロード(サイズの大きなpdfに使うと便利、OSXだとSkimで読むのがおすすめ、Windowsでいいやつ教えて下さい)
  • Pdfでインライン表示
  • Rawでテキストだけを表示

など一通りの機能は揃っています。

honyomi-03.gif

groonga-databse-inspectを使ってMilkodeのデータ使用量を分析する

この記事はGroonga Advent Calendar 2013の6日目です。

これは何?

[groonga-dev,01926] Rroonga 3.1.0

今回のリリースではgroonga-database-inspectというコマンドを追 加しています。このコマンドはデータベースの詳細を表示します。

Rroonga3.1.0からgroonga-database-inspectというコマンドが追加されました。 Groongaの夕べ4の懇親会でも

  • (質問者様) Milkodeって大体容量どれ位使うの?
  • (私) え?(ちゃんと測った事無いぞー)

ということがあったので、しっかりと答えられるようになりたいです。

※ 先に結論を書いてしまうと登録したいパッケージの2.5倍位でした。どうやって調べたかを今から説明します。

インストール

Rroonga3.1.0を入れると自動で付いてきます。

$ gem install rroonga
rroonga (3.1.0)

使い方

Milkodeのデータベースサイズを測ってみます。 データベース位置はデフォルトで~/.milkode/db/milkode.dbです。

テストに使ったのは私が個人的に使用しているMilkodeのデータベース(171 packages, 145744 files) です。

$ groonga-database-inspect ~/.milkode/db/milkode.db
Database
  Path:             </Users/ongaeshi/.milkode/db/milkode.db>
  Total disk usage: 3.521GiB
  Disk usage:       29.266MiB (0.812%)
  N records:        528912
  N tables:         3
  N columns:        17
  Plugins:
    None
  Tables:
    documents:
      ID:               256
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/.milkode/db/milkode.db.0000100>
      Total disk usage: 1.349GiB (38.308%)
      Disk usage:       28.062MiB (0.778%)
      N records:        145744
      N columns:        6
      Columns:
        content:
          ID:         260
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000104>
          Disk usage: 1.199GiB (34.062%)
        package:
          ID:         258
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000102>
          Disk usage: 16.262MiB (0.451%)
        path:
          ID:         257
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000101>
          Disk usage: 36.262MiB (1.006%)
        restpath:
          ID:         259
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000103>
          Disk usage: 44.262MiB (1.227%)
        suffix:
          ID:         262
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000106>
          Disk usage: 24.262MiB (0.673%)
        timestamp:
          ID:         261
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000105>
          Disk usage: 4.004MiB (0.111%)
    packages:
      ID:               269
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/.milkode/db/milkode.db.000010D>
      Total disk usage: 68.602MiB (1.902%)
      Disk usage:       16.062MiB (0.445%)
      N records:        171
      N columns:        6
      Columns:
        addtime:
          ID:         272
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000110>
          Disk usage: 4.004MiB (0.111%)
        directory:
          ID:         271
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010F>
          Disk usage: 20.262MiB (0.562%)
        favtime:
          ID:         275
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000113>
          Disk usage: 4.004MiB (0.111%)
        name:
          ID:         270
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010E>
          Disk usage: 16.262MiB (0.451%)
        updatetime:
          ID:         273
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000111>
          Disk usage: 4.004MiB (0.111%)
        viewtime:
          ID:         274
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000112>
          Disk usage: 4.004MiB (0.111%)
    terms:
      ID:               263
      Type:             patricia trie
      Key type:         ShortText
      Tokenizer:        TokenBigramSplitSymbolAlphaDigit
      Normalizer:       NormalizerAuto
      Path:             </Users/ongaeshi/.milkode/db/milkode.db.0000107>
      Total disk usage: 2.077GiB (58.978%)
      Disk usage:       12.047MiB (0.334%)
      N records:        382997
      N columns:        5
      Columns:
        documents_content:
          ID:         267
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010B>
          Disk usage: 1.834GiB (52.074%)
        documents_package:
          ID:         265
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000109>
          Disk usage: 55.789MiB (1.547%)
        documents_path:
          ID:         264
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.0000108>
          Disk usage: 93.789MiB (2.601%)
        documents_restpath:
          ID:         266
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010A>
          Disk usage: 62.289MiB (1.727%)
        documents_suffix:
          ID:         268
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/.milkode/db/milkode.db.000010C>
          Disk usage: 25.039MiB (0.694%)

3.5GB, 528912 records, 3 tables, 17 columns ありました。

documents (ファイル情報), packages (パッケージ情報), terms (転置インデックス) の3つのテーブルがあり、それぞれ

  • documents 1.349GiB (38.308%)
  • packages 68.602MiB (1.902%)
  • terms 2.077GiB (58.978%)

でした。ざっくりではありますが、データベースは

登録するパッケージのファイル容量 × 2.5

位になっているようです。

空のデータベースと比較

もう少し遊んでみます。空のMilkodeデータベースを作って値を比較してみます。

$ milk init ~/tmp/milkode_test/empty
create     : milkode_test/empty/milkode.yaml
create     : /Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db created.

何も追加されていない状態だとデータベースサイズは29MB位のようです。

$ groonga-database-inspect ~/tmp/milkode_test/empty/db/milkode.db
Database
  Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db>
  Total disk usage: 29.984MiB
  Disk usage:       21.266MiB (70.922%)
  N records:        0
  N tables:         3
  N columns:        17
  Plugins:
    None
  Tables:
    documents:
      ID:               256
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000100>
      Total disk usage: 1.375MiB (4.586%)
      Disk usage:       64.000KiB (0.208%)
      N records:        0
      N columns:        6
      Columns:
        content:
          ID:         260
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000104>
          Disk usage: 268.000KiB (0.873%)
        package:
          ID:         258
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000102>
          Disk usage: 268.000KiB (0.873%)
        path:
          ID:         257
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000101>
          Disk usage: 268.000KiB (0.873%)
        restpath:
          ID:         259
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000103>
          Disk usage: 268.000KiB (0.873%)
        suffix:
          ID:         262
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000106>
          Disk usage: 268.000KiB (0.873%)
        timestamp:
          ID:         261
          Type:       scalar
          Value type: documents
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000105>
          Disk usage: 4.000KiB (0.013%)
    packages:
      ID:               269
      Type:             hash
      Key type:         ShortText
      Tokenizer:        (no tokenizer)
      Normalizer:       (no normalizer)
      Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010D>
      Total disk usage: 616.000KiB (2.006%)
      Disk usage:       64.000KiB (0.208%)
      N records:        0
      N columns:        6
      Columns:
        addtime:
          ID:         272
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000110>
          Disk usage: 4.000KiB (0.013%)
        directory:
          ID:         271
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010F>
          Disk usage: 268.000KiB (0.873%)
        favtime:
          ID:         275
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000113>
          Disk usage: 4.000KiB (0.013%)
        name:
          ID:         270
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010E>
          Disk usage: 268.000KiB (0.873%)
        updatetime:
          ID:         273
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000111>
          Disk usage: 4.000KiB (0.013%)
        viewtime:
          ID:         274
          Type:       scalar
          Value type: packages
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000112>
          Disk usage: 4.000KiB (0.013%)
    terms:
      ID:               263
      Type:             patricia trie
      Key type:         ShortText
      Tokenizer:        TokenBigramSplitSymbolAlphaDigit
      Normalizer:       NormalizerAuto
      Path:             </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000107>
      Total disk usage: 6.742MiB (22.486%)
      Disk usage:       4.047MiB (13.497%)
      N records:        0
      N columns:        5
      Columns:
        documents_content:
          ID:         267
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010B>
          Disk usage: 552.000KiB (1.798%)
        documents_package:
          ID:         265
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000109>
          Disk usage: 552.000KiB (1.798%)
        documents_path:
          ID:         264
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.0000108>
          Disk usage: 552.000KiB (1.798%)
        documents_restpath:
          ID:         266
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010A>
          Disk usage: 552.000KiB (1.798%)
        documents_suffix:
          ID:         268
          Type:       index
          Value type: terms
          Path:       </Users/ongaeshi/tmp/milkode_test/empty/db/milkode.db.000010C>
          Disk usage: 552.000KiB (1.798%)

Groongaデータベースをダンプ、レストアしたい

groonga-database-inspectを使えばデータサイズを解析出来るようになりましたが、バックアップや巻き戻しといったことは出来ないのでしょうか?Rroongaインストール時に一緒についてくるgrndumpというツールを使うと可能なようです。

詳しくは以下の記事をどうぞ。

まとめ

  • Milkodeは登録するパッケージのファイル容量 × 2.5位でデータベースが作成可能っぽい
    • ざっくり分析なのでもう少しサンプルを取ってみたい(他にサンプルとった方がいましたらネットに書いてくれたら嬉しい)
  • groonga-database-inspect便利、Rroonga3.1.0についてくる
  • grndumpを使えばGroongaデータベースのダンプ、レストアも出来る

この辺、自前でデータ管理していると貧弱になりがちな所なので、せっかくGroongaを使っているなら積極的に活用していきたいです。

Milkode1.4リリース - ドリルダウンによるマウスクリックの絞り込み機能を追加!

f:id:tuto0621:20131202210419g:plain

  • ドリルダウンで拡張子、プロジェクト、ディレクトリの絞り込み
  • 国際化
  • milk add -b オプションでブランチ指定
  • gmilkの出力モードにSJISを追加

最新のMilkodeを試してみたい時はmruby Code Searchをどうぞ。

インストール

$ gem install milkode

ダウンロード, Gems

ドリルダウンで拡張子、プロジェクト、ディレクトリの絞り込み

f:id:tuto0621:20131202205750p:plain

マウスクリックだけで絞り込みが出来るようになりました。

国際化

f:id:tuto0621:20131202205717p:plain

support I18N (not finished) by takahashim · Pull Request #2

@takahashimさんのPull Requestのおかげで英語に対応する事が出来ました。

milk add -b オプションでブランチ指定

milk add で git からコードを取得するとき,ブランチ名も指定したい · Issue #51

@nikuさんの要望に対応しました。

gmilkの出力モードにSJISを追加

$ gmilk -o sjis aaa

こちらもリクエストを頂き対応しました。

出力時の文字コードを明示的に指定出来るようになりました。秀丸やWindowsのEmacsなどで文字化けする場合に使ってみて下さい。

リリースノート

  • milk web

    • Add Filtering feature
      • Package
      • Suffix
      • Directory
      • Delete result_refinement
    • Support I18N (thanks takahashim)
    • Bugfix
      • Had forgotten Regexp.escape
  • milk

    • Change Groonga::Schema table.text(“suffix”) -> table.string(“suffix”)
      • Need 'milk rebuild --all'
    • #51 Add ‘milk add -b branch_name’ option (thanks niku)
    • Arrow 'https://.….git' to Util#git_url?
    • Add 'milk add --from-file LIST'
  • gmilk

    • Add ‘gmilk -o’ option (Specify output encode)

関連記事