ファイルサーバ検索システムを作る

職場でHyperEstraierを使わせてもらっているので、自分が引っかかっていろいろ試したことなど、この日記に何度か書いてきました。
でも、トピックごとにばらばらに書き散らしていただけだったので、ここらで一度、基本的な手順のまとめなど書いてみます。

なぜHyperEstraierか

ファイルサーバにいろいろな文書ファイルが降り積もってくると、どうしても必要なファイルを見つけ出すのが困難になってきて、「googleみたいに」検索して探したくなります。これを実現するのが全文検索エンジンと呼ばれるソフトウェアですが、それこそgoogle自身が販売している”イントラネットにつなげばgoogleで検索ができる”代物から、数十万オーダーの市販品、そして無償で利用できるオープンソースのプロダクトまで、いろいろとあります。
オープンソース全文検索エンジンとしては、長くNamazuが定番でしたが、2005年あたりから、次世代をうたう全文検索エンジンが登場してきました。HyperEstraierはその一つで、Namazuに対して次のようなアドバンテージがあります。

  1. Namazuのような辞書ベースの単語抽出を利用したシステムと違い、検索漏れが生じにくい
  2. インデックスの生成・更新が高速
  3. 設置が簡単

設置の容易さについては、HyperEstraierはチュートリアル・ドキュメントもしっかりしているのですが、作者の平林さんがblogに書かれた、典型的なケースでの使用例の短い紹介が印象的でした。今は読めなくなっているようですが*1、ほんの数パラグラフの手順だけで、Windowsベースのファイルサーバ検索システムが構築できてしまいました。
ということで、それに代わる、とまでは言えませんが、最短のステップで検索システムを構築する手順をメモしておきます。

簡単な設置手順

1.パッケージのダウンロードとインストール

まずインストールですが、公式サイトからWindows用のバイナリパッケージをダウンロードして展開します。インストーラは特にないので、展開したフォルダ(estcmd.exeなどがある)にパスを通せばインストールは終わりです。

HyperEstraierは最新バージョン1.4.13までが公開されていますが、Windows用バイナリは1.4.10までしか置かれていません。1.4.10でもそれほど違いはありませんが、検索するとWindowsで最新版を独自にビルドして配布している方もおられるので、それを使用してもよいと思います。

私のビルドしたバージョン1.4.13も置いておきます*2

2.IISのインストールとセットアップ

ファイルサーバ検索をWebブラウザから実行できるようにするため、Webサーバをインストールします。

HyperEstraierの検索ユーザインターフェイスは、CGIが使用できればWebサーバはなんでもいいのですが、すでにほかのWebサーバが稼働しているのでなければ、Windowsで標準的に利用されているIISでいいでしょう。

インストール時に注意する点としては、

  • ファイアウォールの例外設定で、80番ポートの解放をする必要があるかも
  • Vista以降のバージョンに付属のIIS(Ver.7.0以降?)は、CGIサポートがオプションになっているので、「Windowsの機能の有効化」を実行するときにチェックを加える

の2点ぐらいです。

次に、検索ユーザインターフェイスを提供する仮想ディレクトリを作成しておきます。IISの管理ツールから、”仮想ディレクトリの作成”を実行し、適当なエイリアス名(例として'searchpc'とします)とフォルダ(同じく'c:\inetpub\searchpc'とします)を設定します。このとき、ウィザードの途中のアクセス許可で、"CGIの実行"を許可しておきます。

3.最初のインデックス生成

2.で準備したフォルダ(c:\inetpub\searchpc)に移動して、検索のためのインデックスを作成します。検索の対象になるファイルサーバが"\\fserver\doc"でアクセスできるなら、バッチファイル'makeindex.bat'として以下の内容のファイルを作成し、実行します。

if not exist casket estcmd create -xl -attr _lreal seq -attr @cdate num -attr @size num casket
estcmd gather -cl -fx .pdf,.rtf,.doc,.xls,.ppt T@estxfilt -fz -ic CP932 -pc CP932 -sd -cm -cs 512 casket \\fserver\doc\
estcmd extkeys -um casket

2行目の'estcmd gather'で検索対象の共有フォルダを指定しています(共有名の場合は末尾に'\'が必要なようです)。複数の共有フォルダを検索対象とする場合、この行を複数並べることになります。

これで、カレントフォルダ下に'casket'というインデックスが作成されました。次のコマンドラインで、検索のテストを実行できます。

estcmd search -vh casket "検索キーワード" | estcmd iconv -oc cp932

4.検索Webインターフェイスの作成

最後に、検索のためのユーザインターフェイスを用意します。3.でインデックスを作成したフォルダは、IISからアクセスできるように設定しているので、HyperEstraierのインストールフォルダから、Webインターフェイス用のファイルとしてestseek.*と*.dllをコピーします。

さらに、コピーした設定ファイル'estseek.conf'の、'showlreal: false'という行を'showlreal: true'に変更しておきます。これで、検索結果に表示されるアンカータグの参照先がUNCパスそのままになります。

あとは、Webブラウザから'http://hostname/searchpc/estseek.cgi'にアクセスすれば、ファイルサーバ検索システムの出来上がりです。
インデックスの更新のために、3.で作った'makeindex.bat'を定期的に実行する必要がありますが、これは'コントロールパネル'→'タスク'に登録しておけば自動でやってくれます。
ついでに、インデックスの不要データ削除を実行する次のコマンドもバッチファイル'optindex.bat'にしておき、タスクに登録しておきましょう。

estcmd purge casket
estcmd optimize casket

自動実行の間隔は、makeindex.batが1日ごと、optindex.batが週一回程度でよいはずです。

ちょっとした問題点とその対処

以上のように、ちょっとした部門内ファイルサーバの検索システムであれば、わずか数ステップの作業で構築できてしまいます。この手軽さと、インデックス更新の速さはHyperEstraierの強力な利点ですが、使ってみると気付く問題点もいくつかあります。

一部のフォルダ名の下にあるファイルが、検索の対象にならない

公式配布のパッケージでは、”〜表”のような、文字コードの末尾に'0x5c'が来るような名前のフォルダ以下のファイルが検索の対象になりません。

フォルダ名の取り扱いの問題のようで、この日記の以前のエントリで調査と修正について記述しました。上でリンクした、私のビルドしたバージョン1.4.13では、この修正を行っているので、問題は生じないはずです。

検索結果のリンクにあらわれる一部の文字が化ける

ファイル名のパスに、WindowsUnicode・マルチバイト変換で問題が生じる一部の文字が入っていると、パス情報が文字化けしてしまう場合があるようです。

私の場合、ファイルサーバ上の"〜"を含んだフォルダ名以下のファイルが、検索の結果に含まれるリンクからアクセスできなくなってしまいました(検索システムの持っているパス名の"〜"が、逆向きの記号になってしまう)。

これは文字コード変換ライブラリiconvとWindowsの仕様が食い違っているために生じる問題で、iconvをWindowsの動作に合わせるパッチもあるようですが、とりあえず簡単な解決策として、estseek.cgiの設定で変換することで回避しました。
estseek.confに以下の設定を入れています(手抜き)。

replace: 〜{{!}}〜

(と思って、ここに書いたら両方"〜"に変換されてしまいました... 右側は波ダッシュでなく、全角チルダ?です。なにか書き込む方法あるのかな?)

ファイルの種類やソート順の指定が難しい

検索のWebインターフェイスは、"MS Officeの文書を種類(Word/Excel/Powerpoint)を指定して検索したい" "検索結果のソート順をいろいろ変更したい"といった場合に、属性検索式を入力する必要があるなど、ちょっと難しい場合があります。

estseek.cgiに相当するプログラムを自分で書けばいいのでしょうが、なかなかそこまでできないので、estseek.cgiが使用するHTMLテンプレートに、Javascriptのコードを仕込んで多少の細工をしてみました。

かなり適当なので、私の手元の環境以外でどこまで動くか不明ですが、一応さらしておきます→estseek.tmpl改造版

IIS 7.0では追加の設定が必要(2010/1/13追記)

上の「IISのセットアップ」のところではスルーしてしまいましたが、Vista以降に付属のIIS 7.0では、estseek.cgiを実行するにはこれだけではだめなようです(そもそも”仮想ディレクトリの作成ウィザード”の中で、CGIの一括許可ができない)。必要な処置は:

  1. 追加した仮想ディレクトり(上記の例のsearchpc)で、拡張子*.cgiをCgiModuleに結び付けるマップを追加
  2. IIS全体の設定で、特に指定していないEXEファイルのCGI実行を許可

の2つになります。どちらも、コントロールパネル→管理ツール→IISマネージャから設定します。

(1)拡張子CGIのマップ追加

  1. IISマネージャ左のツリーから、<ホスト名>→サイト→Default Web Site→<仮想ディレクトリ名>を選び、このときの中央ペインで「ハンドラマッピング」をダブルクリックします。
  2. 右の操作一覧から、「モジュールマップの追加...」を選択します。
  3. 表示されるダイアログで、”要求パス”に"*.cgi"、”モジュール”からCgiModuleを選択し、”名前”欄に"CGI実行(*.cgi)"と入力してOKを押します。

(2)指定のないEXEの実行を許可

  1. IISマネージャ左のツリーから、<ホスト名>欄を選び、中央のペインの「ISAPIおよびCGIの制限」をダブルクリックします。
  2. 右の操作一覧から、「機能設定の編集...」を選択します。
  3. 表示されるダイアログで、"特定できないCGIモジュールを許可する"にチェックを入れてOKを押します。

(1)、(2)の2つを実行して初めて、estseek.cgiIISの元でCGIとして実行できるようになります。

*1:Internet Archiveには残っています

*2:このパッケージは公式配布のものからJava/Rubyのサポートを除き、後で触れるディレクトリスキャン動作の問題の修正パッチをあてたものです。ライセンス・配布条件などはオリジナルに従いますが、公式配布と完全に同等であることは保障できません。特に、クローラ周りは全くチェックしていませんので、ご利用の場合はその点をご注意ください。