ongaeshi / milkode

Source code search engine of line-oriented written by Ruby
http://milkode.ongaeshi.me
Other
147 stars 29 forks source link

検索結果が多すぎる場合 #58

Closed kazuna closed 10 years ago

kazuna commented 10 years ago

検索した結果が多すぎるとこのエラーが出るみたいなのですが、いくつぐらいまでなら大丈夫なのでしょうか?

それからgrepなどを代わりに使えと出ますがうまく動かないようなのですが、何が問題なのでしょうか?

$>gmilk -a NULL
Number of records is large. Use auto external tool (gmilk -e grep)
C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:262:in `exist?': can't convert nil into String (Type Error)
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:262:in `block in pickup_files'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:261:in `each'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:261:in `pickup_files'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:231:in `search_external_tool'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:215:in `execute'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/bin/gmilk:10:in `<top (required)>'
        from C:/Ruby/bin/gmilk:23:in `load'
        from C:/Ruby/bin/gmilk:23:in `<main>'

$>gmilk -e grep -a NULL
C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:262:in `exist?': can't convert nil into String (Type Error)
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:262:in `block in pickup_files'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:261:in `each'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:261:in `pickup_files'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:231:in `search_external_tool'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:169:in `execute'
        from C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/bin/gmilk:10:in `<top (required)>'
        from C:/Ruby/bin/gmilk:23:in `load'
        from C:/Ruby/bin/gmilk:23:in `<main>'
ongaeshi commented 10 years ago

報告ありがとうございます。 エラーメッセージを一部整形させてもらいました。

Number of .. はマッチしたレコードが多い時にgrep等を使って高速に検索する機能です。gmilk -e grep するとマッチしたレコードが少なくてもgrepを使って検索します。上記エラーメッセージを見る感じ、その部分は正しく動いている印象です。 ※ そもそもgrepやxargsの無い環境だと上記機能は起動しません。

検索結果の制限はMilkode側ではかけているつもりは無いのですが、内部で使っているライブラリやリソース不足で何か起きているのかもしれません。

$ gmilk -a NULL -c

だとどのような結果が出ますか?

ongaeshi commented 10 years ago

Number of ..の英文が変だったので変更しておきます。

kazuna commented 10 years ago

色々と試したところ、rebuildをかけると前述のcli_grep.rb:262のエラーが出なくなりましたが、相変わらず検索結果が多いと結果が表示されないようです。

とくに'-e grep'と指定しても'xargs'を使用しようとしているように見受けられます。

また質問ですが、"Number of ..."の場合でも強制的に外部プログラムを使わずに検索することは出来ないのでしょうか?

$>gmilk -a NULL Number of records is large. Use auto external tool (gmilk -e grep) 'xargs' is not recognized as an internal or external command, operable program or batch file.

$>gmilk -a NULL -c 7518 records

$>copy \Windows\System32\findstr.exe grep.exe 1 file(s) copied.

$>gmilk -e grep -a NULL 'xargs' is not recognized as an internal or external command, operable program or batch file.

$>copy grep.exe xargs.exe 1 file(s) copied.

$>gmilk -e grep -a NULL FINDSTR: Cannot open -n FINDSTR: Cannot open NULL

ongaeshi commented 10 years ago

rebuildされたことでデータベース周りのエラーは直ったけど、 次に外部プログラムを使ったエラーが出てしまっているみたいですね。 トラブルが多くてすいません。

本来はgrepやxargsが入っていない環境(素のWindowsなど)だと 外部プログラムの検索を行わないはずなのですが、その判定が上手くいっていないようです。 私のWindows環境だとCygwinが入っていたため上手く動いていました。

ダウンロードしたgem本体に手を入れるパッチ的な対処になりますが、

C:/Ruby/lib/ruby/gems/1.9.1/gems/milkode-1.4.0/lib/milkode/grep/cli_grep.rb:212

              # レコード数が多い時は"-e grep"で検索
              if Util::exist_command?('cat') && Util::exist_command?('grep') && Util::exist_command?('xargs')
                $stderr.puts "Because number of records is large, Milkode use external tool. (Same as 'gmilk -e grep')"
                search_external_tool(arguments, option, records, 'grep -n', 'grep')
              else
                findGrep.searchAndPrint2(stdout, records)
              end

              # レコード数が多い時は"-e grep"で検索
              findGrep.searchAndPrint2(stdout, records)
              # if Util::exist_command?('cat') && Util::exist_command?('grep') && Util::exist_command?('xargs')
              #   $stderr.puts "Because number of records is large, Milkode use external tool. (Same as 'gmilk -e grep')"
              #   search_external_tool(arguments, option, records, 'grep -n', 'grep')
              # else
              #   findGrep.searchAndPrint2(stdout, records)
              # end

のように書き換えると、外部プログラムを使わずに検索出来るはずです。 次回更新までには何らかの対策をしておきます。

※ お使いの環境はCygwin等のUNIXツールが入っていないWindowsでしょうか?

kazuna commented 10 years ago

お察しの通りCygwin等を入れていない素のWindowsです。 対策を考慮していただきありがとうございます。

ところで結果が沢山あった場合に外部検索とは、何レコードくらいを沢山と定義しているのでしょうか?

ongaeshi commented 10 years ago

現状だと500レコードがしきい値になっています。 以前マッチ数が多いと遅すぎる、という指摘を受けてこのような機能を付けた経緯があります。

ongaeshi commented 10 years ago

de30315 にて修正しました。対応が遅くなりました。

素のWindowsでも外部プログラムの検索が出来るようになったので、 レコード数が多くても間違えてxargsを使うことはないはずです。

また、--no-externalを使うと強制的に外部プログラムの使用を抑制します。 これは1.5.0でも使えるはずです。

次回バージョンアップに反映される予定です。 報告ありがとうございました。

ongaeshi commented 10 years ago

Milkode 1.6 に反映されました。