# イントロダクション

Copyright (C) 2004-2007 Mikio Hirabayashi
Last Update: Tue, 06 Mar 2007 12:05:18 +0900
[English/Japanese] [HOME]

## 目次

1. はじめに
2. インストール
3. 検索機能の配備
4. 補足

## はじめに

Hyper Estraierは全文検索システムです。たくさんの文書の中から、特定の語句を含むものを探して、該当するものの一覧を表示することができます。Webサイトを運営している方なら、自分のサイト専用の検索エンジンとして利用することができます。メールボックスやファイルサーバを対象とした検索ツールとして利用することもできます。

Hyper Estraierには、次のような特徴があります。

- インデックスを使った高速な検索ができます。
- 大量の文書のインデックスを短時間で作成できます。
- N-gram方式による漏れのない検索ができます。
- 形態素解析とN-gramのハイブリッド機構で検索精度を向上させます。
- フレーズ検索や正規表現検索や属性検索や類似検索をサポートします。
- 世界各国の言語が扱えます。
- 対象文書の所在や形式に依存しません。
- 賢いWebクローラが付属しています。
- ライブラリとして各種製品に組み込めます。
- P2P連携機能をサポートします。

まずは、Hyper Estraierのデモサイト（Wikipedia検索、JavaのAPI検索）を試してみてください。Hyper Estraierがどんなものかお分かりいただけるかと思います。

Hyper Estraierは二つの側面を持ちます。一つ目は、全文検索システムを構築するためのライブラリであることです。つまり、プログラマが利用するAPI（Application Programming Interface）を備えています。Hyper EstraierのAPIを利用することにより、全文検索の高度な機能を自分のプログラムに簡単に組み込むことができます。

二つ目は、上述のAPIを使ったアプリケーションであることです。検索用のインデックスを管理するコマンドと、Webインターフェイスで検索を行うためのCGIスクリプトが提供されます。それらを使うことにより、典型的な検索システムならプログラミングをしないで構築することができます。

この文書では、Webサイトの検索機能を題材に、上述のコマンドとCGIスクリプトを使って検索システムを構築する方法を説明します。まずは付属のコマンドとやCGIスクリプトを利用方法を習得してから、それでは実現できない機能が必要ならばAPIを使ったアプリケーションで補うようにするとよいでしょう。Hyper Estraierは豊富な機能を備えていますが、その全ての使い方を覚える必要はありません。Webサイトの検索システムを構築するなら、この文書だけ読めば十分です。

## インストール

Hyper Estraierのソースパッケージからのインストール方法を説明します。バイナリパッケージのインストール方法についてはそれぞれのパッケージの説明書をご覧ください。

### 前提

Hyper Estraierの現在バージョンは、UNIX系およびWindows NT系のOSで利用することができます。少なくとも、以下の環境では動作するはずです。

- Linux 2.2以降 (IA32/IA64/AMD64/SPARC/Alpha)
- FreeBSD 4.9以降 (IA32/Alpha)
- Solaris 8以降 (IA32/SPARC)
- Mac OS X 10.2以降 (IA32/PowerPC)
- HP-UX 11.11以降 (IA64/PA-RISC)
- Windows 2000以降 (IA32/IA64/AMD64)

ソースパッケージを用いてHyper Estraierをインストールするには、`gcc`のバージョン2.95以降と`make`が必要です。それらはLinuxやFreeBSDには標準的にインストールされています。

Hyper Estraierは、以下のライブラリを利用しています。予めそれらをインストールしておいてください。

- libiconv : 文字コード変換。バージョン1.9.1以降（glibcにも同梱）。
- zlib : 可逆データ圧縮。バージョン1.2.1以降。
- QDBM : 組み込み用データベース。バージョン1.8.75以降。

なお、QDBMをインストールする際には、zlibを有効化（`./configure --enable-zlib`）しておくことをお薦めします。その方がHyper Estraierの作るインデックスが小さくなります。QDBMの1.8.74以前のバージョンはサポートされませんので注意してください。

### ビルドとインストール

Hyper Estraierの配布用アーカイブファイルを展開したら、生成されたディレクトリに入ってインストール作業を行います。

`configure`スクリプトを実行して、ビルド環境を設定します。

    ./configure

プログラムをビルドします。

    make

プログラムの自己診断テストを行います。

    make check

プログラムをインストールします。作業は`root`ユーザで行います。

    make install

### 結果

一連の作業が終ると、以下のファイルがインストールされます。

    /usr/local/include/estraier.h
    /usr/local/include/estmtdb.h
    /usr/local/include/estnode.h
    /usr/local/lib/libestraier.a
    /usr/local/lib/libestraier.so.8.38.0
    /usr/local/lib/libestraier.so.8
    /usr/local/lib/libestraier.so
    /usr/local/lib/pkgconfig/hyperestraier.pc
    /usr/local/bin/estcmd
    /usr/local/bin/estmttest
    /usr/local/bin/estmaster
    /usr/local/bin/estbutler
    /usr/local/bin/estcall
    /usr/local/bin/estwaver
    /usr/local/bin/estload
    /usr/local/bin/estconfig
    /usr/local/bin/estwolefind
    /usr/local/libexec/estseek.cgi
    /usr/local/libexec/estfraud.cgi
    /usr/local/libexec/estproxy.cgi
    /usr/local/libexec/estscout.cgi
    /usr/local/libexec/estsupt.cgi
    /usr/local/share/hyperestraier/estseek.conf
    /usr/local/share/hyperestraier/estseek.tmpl
    /usr/local/share/hyperestraier/estseek.top
    /usr/local/share/hyperestraier/estseek.help
    /usr/local/share/hyperestraier/estfraud.conf
    /usr/local/share/hyperestraier/estproxy.conf
    /usr/local/share/hyperestraier/estscout.conf
    /usr/local/share/hyperestraier/estsupt.conf
    /usr/local/share/hyperestraier/estresult.dtd
    /usr/local/share/hyperestraier/estraier.idl
    /usr/local/share/hyperestraier/locale/...
    /usr/local/share/hyperestraier/filter/...
    /usr/local/share/hyperestraier/increm/...
    /usr/local/share/hyperestraier/doc/...
    /usr/local/man/man1/...
    /usr/local/man/man3/...

### Mac OS XとHP-UXとWindows

Mac OS Xの場合、「`make`」の代わりに「`make mac`」、「`make check`」の代わりに「`make check-mac`」、「`make install`」の代わりに「`make install-mac`」を実行してください。なお、Mac OS Xでは共有ライブラリの命名規則が異なります。「`libestraier.1.0.0.dylib`」「`libestraier.1.dylib`」「`libestraier.dylib`」になります。

HP-UXの場合、「`make`」の代わりに「`make hpux`」、「`make check`」の代わりに「`make check-hpux`」、「`make install`」の代わりに「`make install-hpux`」を実行してください。なお、HP-UXでは共有ライブラリの命名規則が異なります。「`libestraier.sl`」になります。

Windows上でビルドを行う場合には、CygwinおよびMinGWの開発環境が必要です。また、zlibとlibiconvとQDBMのMinGW版がそれぞれインストールされている必要があります。その上で、「`make win`」を実行してください。Windows用のインストールコマンドは用意されていません。Windows版のアプリケーションを動作させるには、「`estraier.dll`」だけでなく、「`mgwz.dll`」「`libiconv-2.dll`」「`regex.dll`」「`qdbm.dll`」「`pthreadGC2.dll`」も必要です。なお、Windows版のバイナリパッケージには必要なライブラリが全て納められていますので、そちらを使うことをお薦めします。

### configureのオプション

「./configure」を実行する際には、以下のオプションを指定することができます。

- `--enable-debug` : デバッグ用にビルドします。デバッグシンボルを有効化し、最適化を行わず、静的にリンクします。
- `--enable-devel` : 開発用にビルドします。デバッグシンボルを有効化し、最適化を行い、動的にリンクします。
- `--enable-mecab` : MeCabによるキーワード抽出を有効にします。
- `--disable-zlib` : ZLIBによる転置インデックスのレコード圧縮を無効にします。
- `--enable-lzo` : ZLIB圧縮の代わりにLZO圧縮を用います。
- `--enable-bzip` : ZLIB圧縮の代わりにBZIP2圧縮を用います。
- `--enable-vista` : Villaデータベースの代わりにVistaデータベースを用います。

MeCabを組み込む場合、MeCabのバージョン0.92以降と、MeCab-IPADICの2.7.0以上を用い、辞書の文字コードはEUC-JP（デフォルト）にしてください。

## 検索機能の配備

Webサイトの検索機能を例にとって、検索機能を動作させるための手順を説明します。意外に簡単にできますので、ぜひ実際に設置してみてください。

### インデックス管理用のコマンド

Hyper Estraierでは、高速な検索を可能にするために、転置インデックスと呼ばれるデータベースを利用します。つまり、検索を行う前に、検索対象の文書を登録した転置インデックスを構築しておく必要があります。以後は転置インデックスのことを単にインデックスと言います。

インデックスを管理するために、`estcmd`というコマンドが提供されます。`estcmd`はローカルホストのファイルシステム上にある個々のファイルを文書として扱います。インデックスに文書を登録したり、インデックス内の文書情報を削除することができます。また、特定のディレクトリの以下の文書を一括して登録することもできます。対応している文書の形式は、プレーンテキストと、HTMLと電子メール（MIME）です。

その他の形式の文書を扱ったり、リモートホストにあるファイルを扱ったりすることもできるのですが、その方法については後々説明します。

### インデックスの作成

あなたがWebサイトを運営していて、そのコンテンツが「`/home/www/public_html`」以下に置いてあるとしましょう。その下にある全てのHTMLファイルを登録したインデックスを「`/home/www/casket`」として作成することにします。それには、以下のコマンドを実行します。

    cd /home/www
    estcmd gather -il ja -sd casket /home/www/public_html

「`/home/www/public_html`」以下の文書を収集して、`casket`という名前のインデックスを作るという意味です。「`-il ja`」オプションは、文字コードの判定時に日本語を優先するという意味です。「`-sd`」オプションは、ファイルの作成日時と更新日時をインデックスに記録するという意味です。実行すると、進捗状態のログメッセージが出てから、`casket`というディレクトリが作成されます。このディレクトリがインデックスです。インデックスの作成に必要な手順はこれだけです。

### 検索用CGIスクリプト

検索はWebインターフェイスで行います。Webブラウザで検索用ページにアクセスすることで、検索を行います。`estseek.cgi`はそのためのCGIスクリプトです。CGIスクリプトを動作させるためのWebサーバの設定については、各サーバのマニュアルをご覧ください。

### 検索用ページの設置

CGIスクリプトの設置場所のURLが「`http://www.estraier.ad.jp/cgi-bin/`」で、そのローカルのパスが「`/home/www/cgi-bin`」だとしましょう。その場合、以下のコマンドを実行します。

    cd /home/www/cgi-bin/
    cp /usr/local/libexec/estseek.cgi .
    cp /usr/local/share/hyperestraier/estseek.* .

「`/usr/local/libexec/estseek.cgi`」と、「`/usr/local/share/hyperestraier/`」にある`estseek.conf`と`estseek.tmpl`と`estseek.top`と`estseek.help`を、「`/home/www/cgi-bin/`」にコピーするという意味です。`estseek.cgi`はCGIスクリプトです。`estseek.conf`は設定ファイルです。`estseek.tmpl`は検索ページのテンプレートファイルです。`estseek.top`は検索ページの初期画面のメッセージを記述したファイルです。`estseek.help`は検索機能の簡単な使い方を記述したファイルです。なお、それらを日本語化したものが「`/usr/local/share/hyperestraier/locale/ja/`」の下にありますので、そちらを利用してもよいでしょう。

適当なテキストエディタで、設置された`estseek.conf`を開いて編集します。多くの項目はそのままでよいのですが、`indexname`と`replace`だけは変更する必要があります。以下のように書きます。

    indexname: /home/www/casket
    ...
    replace: file:///home/www/public_html/{{!}}http://www.estraier.ad.jp/
    ...

`indexname`はインデックスのパスを指定します。`replace`はローカル用のURIをWebサーバ用のURIに変換する指定です。「`{{!}}`」の前後にローカルの接頭辞とWebサーバ用の接頭辞を書きます。

### 使ってみよう

これで準備はOKです。Webブラウザで、「`http://www.estraier.ad.jp/cgi-bin/estseek.cgi`」にアクセスしてみてください。詳しい使い方はそのページに書いてあります。

### インデックスの更新

サイト内の文書が更新されたり、新しい文書が追加されたりした場合、適当な頻度でインデックスも更新するとよいでしょう。古いインデックスを削除して新しく作りなおしてもよいのですが、Hyper Estraierではインデックスの差分登録をすることもできます。

インデックスを作る際に「`-sd`」オプションをつけてファイルの更新時刻を記録していたのは、差分登録のためです。更新時刻を記録したインデックスに対しては、「`-cl`」と「`-sd`」と「`-cm`」オプションをつけて更新を行うことで、差分登録を行うことができます。

    cd /home/www
    estcmd gather -cl -il ja -sd -cm casket /home/www/public_html

「`-cm`」オプションをつけると、まだインデックス内に存在しないか、前に登録した時より更新時刻が新しい文書のみを登録します。なお、既存の文書とURLが同じ文書を登録すると上書きされますので、古い文書は検索にヒットしなくなります。「`-cl`」オプションをつけると、上書きされた文書が含んでいた語句のインデックスを再構築します。次に更新をする時のために「`-sd`」オプションもつけて更新日時を記録しています。

### 削除文書の反映

サイト内の文書が削除された場合も、それをインデックスに反映して検索にヒットしないようにします。以下のコマンドを実行します。

    cd /home/www
    estcmd purge -cl casket

インデックス内の文書情報をスキャンして、元の場所にファイルがないものを削除します。「`-cl`」オプションは、削除された文書が含んでいた語句のインデックスを再構築することを指示します。

### インデックスの最適化

文書の登録や削除を繰り返すと、少しずつインデックスのサイズが肥大化してきます。データベースを最適化するとそれを解消してサイズを縮小することができます。

    cd /home/www
    estcmd optimize casket

なお、`gather`や`purge`を実行する際に「`-cl`」をつけなかった場合、上書きまたは削除された文書の情報は、削除マークが付けられるだけでインデックス内に残っています。最適化はインデックスを再構築して削除文書の領域を完全に消去する効果もあります。

### 更新作業の自動化

コマンドを定期的に実行する`cron`などの機能を使ってインデックスの更新作業を自動化すると楽です。その際には、以下のようなスクリプトを書いておくとよいでしょう。

    /usr/local/bin/estcmd gather -cl -il ja -sd -cm /home/www/casket /home/www/public_html
    /usr/local/bin/estcmd purge -cl /home/www/casket

ただし、`purge`は毎回の更新で必要なわけではありません。それらは比較的重い処理なので、たまにやるだけで充分です。個人のWebサイトの検索システムであれば、`gather`は毎日、`purge`は毎週といった頻度にしてもよいでしょう。また、月に一度くらいで`optimize`を行ってもいいでしょう。

### 詳しい使い方

コマンドやCGIスクリプトの詳しい使い方に関してはユーザガイドをご覧ください。APIの詳しい使い方に関してはプログラミングガイドをご覧ください。

Hyper Estraierの真価は、そのP2P機構にあります。P2P機構を使わなくても一般的な全文検索システムとして十分に有用だとは思いますが、それに飽きたら、ぜひともP2P機構を使ってみていただきたいと思います。たとえマシンを1台しか持っていなくても、検索と更新が並列に行えたり、複数のインデックスを扱えたり、Atomフィードが配信できたりといった様々な利点が得られます。P2P機構の詳しい使い方に関してはP2Pガイドをご覧ください。

Hyper EstraierにはWebを巡回して文書を集めてくるクローラも付属しています。それを使うと特定のWebサイトや不特定多数のWebサイトを対象としたサーチエンジンを簡単に構築することができます。詳しくはクローラガイドを御覧ください。

## 補足

作者の連絡先などの補足事項を紹介します。

### 連絡先

Hyper Estraierは平林幹雄が作成しました。作者と連絡をとるには、``mikio@users.sourceforge.net`' 宛に電子メールを送ってください。ただし、質問やバグレポートなど、他のユーザと共有できる話題はメーリングリストに送ってください。メーリングリスト（日本語）の参加方法については、``http://lists.sourceforge.net/lists/listinfo/hyperestraier-users-ja`' を参照してください。

### ライセンス

Hyper Estraierはフリーソフトウェアです。あなたは、Free Software Foundationが公表したGNU Lesser General Public Licenseのバージョン2.1あるいはそれ以降の各バージョンの中からいずれかを選択し、そのバージョンが定める条項に従ってHyper Estraierを再頒布または変更することができます。

Hyper Estraierは有用であると思われますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細についてはGNU Lesser General Public Licenseを読んでください。

あなたは、Hyper Estraierと一緒にGNU Lesser General Public Licenseの写しを受け取っているはずです（``COPYING`' ファイルを参照してください）。そうでない場合は、Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA へ連絡してください。

### 謝辞

Hyper Estraierは情報処理推進機構（IPA）による2004年度第2回未踏ソフトウェア創造事業の支援を受けて開発されました。同機構の関係各位および鵜飼文敏PMに感謝いたします。また、有用な助言をくれた皆様、そして、Hyper Estraierのユーザの皆様にお礼を申し上げます。