あらかじめインデックスを作っておいて,そこから検索してくれるプログラムを作ってみた.
検索エンジンについての勉強などはしていないので,勘で作った.
一応検索はできるが,実用性は無い感じになった.
http://github.com/hitode909/newgrep/
使い方
プログラムを検索対象にするために,あらかじめインデックスを作っておく.
% indexer *.rb (1/3) indexing indexer.rb (2/3) indexing model.rb (3/3) indexing searcher.rb
これで,検索コマンドを実行したディレクトリ以下のインデックスされたファイルのインデックスから検索できる.
% searcher require /Users/fkd/co/newgrep/indexer.rb 5:require 'model' /Users/fkd/co/newgrep/model.rb 2:require 'rubygems' 3:require 'logger' 4:require 'sequel' /Users/fkd/co/newgrep/searcher.rb 5:require 'model'
検索された語がヒットしない場合は,登録されている語を前方一致で提示する.
% searcher fla flayer (499) flags (88) flag (47) flash (6) flaws (3)
仕組みとか
ファイル中から\w+にマッチするものを抽出して,インデックスとして利用している.
記号を含む文字列の検索はできない.$は特別扱いするとかすれば記号も検索できるけど,Perl用に調整するみたいなのはどうかと思ったので,やってない.
二単語以上での検索はできない.作ってないため.
ファイルを更新した場合は手動でインデックスを更新する必要がある.
インデックスはMySQLに入る.
評価
gnu screenのソースコードをチェックアウトして,intという文字列を検索してみた.
grep | 0.105秒 |
ack | 0.496秒 |
今回作ったやつ | 0.815秒 |
今回作ったやつは,ソースコードをインデックスするのに22分くらいかかった.
感想
grepは線形に探してるだけなのだから,インデックス作ればgrepに勝てるだろうと思っていたら,実はgrepがめちゃくちゃ速くて,勝つことができなかった.
とてもgrepできないくらいの量のソースコードを検索させれば勝てるのかもしれないけど,そうすると,インデックス作るのが終わらなくなりそう.
あと,Rubyで作ったのも,悪かったかもしれない.Rubyを起動するだけで0.15秒くらいかかるので,その間にgrepなら終わってる.
Perlは一瞬で起動するので,今度はPerlで書いてみようと思う.