HyperEstraierのディレクトリスキャン

HyperEstraierのインデックス作成で、ディレクトリを指定してスキャンさせるより、個別のファイルパス渡したほうが高速で安全。

つまり、

estcmd gather ... <dir>

というようにせず、

estcmd gather ... <file>

みたいにした方が良いです、っていう話です。

1. ディレクトリ名が「表」で終わると、それ以下のファイルがスキャンされない

HyperEstraierでは、文書を登録する時、ディレクトリを指定するとファイルを再帰的に取得してインデックスに追加してくれます。ところが、これを使ったとき、「表」で終わるディレクトリ名以下のファイルがインデックスされません。この問題は既に知られていて、最新バージョン(1.4.13)にさらに修正を追加したしたWindowsバイナリが配られています。

一部の日本語フォルダ名でインデックスが作成されない件、とその回避パッチ@めも日記

ファイルサーバ検索システムを作る@めも日記 — 修正版Winバイナリがここで取得できる

2. ディレクトリ名「clock」以下のファイルがスキャンされない

何故か、「clock」ディレクトリ以下をスキャンしない現象が起きます。たとえば、簡単なディレクトリ構造を作ってテストしてみると、

C:\test>dir /s /b /a:-d C:\test
c:\test\clock\a.txt
c:\test\dir1\a.txt

C:\test>estcmd scandir -tf -pa C:\test
C:\test\dir1\a.txt

となってしまいます。前述の「1.」に書いた1.4.13版と、本家のWindows版1.4.10でも結果は同じでした。ソースを読む能力も無く、原因はよく分からないですが、estcmdのディレクトリ指定使わず、登録文書のパスが書かれたファイルをあらかじめ準備しておいて、それを代わりに指定することで、この問題は回避できました。

登録文書のパスのリストは、もとから入ってるdirとか、NT版UNIX-like toolsに含まれるfindf.exe (NT版find)を使うことでできます。例えば、

dir /s /b /a:-d C:\Doc
findf C:\Doc -type f -printms

として作れます。

3. estcmdのディレクトリスキャンがあまり速くない

前述の「2.」で書いたことと関連するのですが、

estcmd gather ... <dir>

とか、

estcmd scandir <dir>

のようなディレクトリスキャンは、結構遅いです。ローカルディスクなんかだとそれほど気にならないのですが、ネットワーク上の共有フォルダとかを対象にした場合、スキャン自体に時間がかかっているように見えます。スピードアップするためにも、「2.」で書いた方法であらかじめ登録対象のファイルパスをリストしておいて、estcmd gatherに渡すのが良さそうです。

estcmdのディレクトリスキャンが遅いことを確かめるために、以下の3つの方法で、6万8千ファイルの置かれた共有フォルダのファイルリストを作り、所要時間を比べてみました。

estcmd scandir -tf -pa \\host\share\
dir /s /b /a:-d \\host\share\
findf \\host\share\ -type f -printms

コマンド 実行時間
estcmd scandir -tf -pa \\host\share\ 496.2[sec]
findf \\host\share\ -type f -printms 27.7[sec]
dir /s /b /a:-d \\host\share 34.9[sec]

estcmdがかなり遅いことが分かります。pdfやwordといったファイルを登録する場合、フィルタで一つ一つ処理が実行されるので、このフィルタの所要時間の方が支配的になり、遅いことは無視できますが、テキスト等をある程度登録する場合では、かなり速度が違うのではないかと思います。

結局、「2.」の問題を回避するためには、ファイルリストを渡すほかないです。そうすれば、「3.」は自動的に解決されます。

コメントをどうぞ