このページは、オープンソースマガジン2006年4月号の第2特集「新世代検索エンジン大集合」に寄稿した記事の校正前の版です。


超弩級全文検索システムHyper Estraier

平林 幹雄 <mikio@users.sourceforge.net>

巷で話題の全文検索システムHyper Estraier。Webサイトやデスクトップの検索システムとして使えることはもちろん、ライブラリとして様々な用途に使うことができます。本稿ではその特徴を説明し、導入から応用までを案内します。


Hyper Estraierのススメ

O型のあなた、デスクトップにウンザリするほどのファイルが散らかっていませんか? A型のあなた、フォルダで整理したつもりが、階層が深すぎて毎回探すのが面倒になっていませんか? B型のあなた、人から貰ったファイルの保存場所を忘れて何度も再送してもらうことはありませんか? AB型のあなた、メーリングリストやメールマガジンに登録しすぎてメーラを開くと大変なことになっていませんか? そんな皆様にお奨めしたいのが、全文検索システムHyper Estraier(ハイパーエストレイア。以下H.E.)です。

全文検索のススメ

大量のデータの中からユーザの求める部分を捜し出す技術を情報検索と言います。一口に情報検索と言っても様々なカテゴリがありますが、全文検索もそのうちの一つと言えます。全文検索という言葉に明確な定義があるわけではありませんが、「人間が本の全てのページを通読するのと同じくらいの精度(正確性)と再現率(網羅性)の検索をコンピュータが代行する技術」であると筆者は考えています。私達の身の回りの電子文書の量は日々増大していくばかりで、もはや人間が全てに目を通すことは適いません。したがって、全文検索などの検索技術を賢く使って情報を取捨選択する術を見につけることが今後ますます重要になっていくことでしょう。

GoogleやYahooでWeb上の文書を探すように、自分が持っているデータを素早く捜し出せたら素敵ですよね。H.E.は、そんな希望に応えるフリーソフトウェアの全文検索システムです。コンセプトは、高性能・高機能・簡単の三拍子揃った検索システムということです。

高性能

H.E.の最たる特徴は、とにかく高速に検索ができることです。まず以下のURLのデモサイトにアクセスしてみてください。その速さと便利さを実感していただけると思います。

H.E.は、いわゆるインデックス型の検索システムです。検索対象の文書を登録したインデックスを予め作成(インデクシング)しておくことで、検索時に高速に結果を出すことができます(†column01)。多くの検索システムではインデクシングに多くの時間がかかって管理が面倒になりがちなのですが、H.E.はインデクシングの速度も抜群に速いです。筆者の開発環境(CPUはPentium4の1.7GHz、RAMは1GB搭載のノートPC)で上記のデモサイトの文書約16万件を対象としたインデックスを作成したところ、43分ほどで完了しました。

全文検索システムの性能指標のひとつに、スケーラビリティがあります。インデックスにどれだけたくさんの文書を登録できるかということです。対象文書の内容やマシンの性能やインデクシングにどれだけ待てるのかといったユーザの事情によって限界は異なりますが、少なくとも400万件のメールをひとつのインデックスに登録して運用しているユーザがいます。なお、後述するP2P連携機能を利用すると、複数のコンピュータにインデックスを分散させてさらに大規模な検索システムを構築することもできます。

高機能

H.E.の最も典型的な使い方は、自分のWebサイトに専用の検索機能をつけることでしょう。でも、それだけではありません。会社のファイルサーバにあるWord/Excel/PowerPoint/PDFなどのファイルを対象にした検索システムとして使うこともできます。個人用PCのハードディスク内にあるファイルを対象にした検索システムとして使うこともできます。英語の新聞や論文集を検索対象にして、英単語の用例を調べても便利でしょう。H.E.は、どんな場所にあるどんなデータを対象にしても活用できる汎用の検索システムです。検索対象の文書はファイルである必要すらなく、データベース内のレコードやメールボックス内のメールを扱うこともできます。

H.E.のアーキテクチャをimage01に示します。文書をインデックスに登録するには、文書が格納してある場所(リポジトリ)から個々の文書を取り出す機能(クローラ)と、各文書に記録されているテキストを抜き出す機能(フィルタ)が必要です。H.E.のパッケージには、ローカルのファイルシステムからファイルを収集するクローラと、一般的なファイル形式(プレーンテキスト、HTML、電子メール、PDF、Wordなど)からテキストを抽出するフィルタがバンドルされています。バンドルされたもので対応できない場合は、外部のコマンドを組み合わせたり、独自のプログラムを書いて拡張したりして対応することができます。また、多言語対応というのも特徴の一つです。Unicode(UCS2)の全ての文字を扱えるので、日本語や英語はもちろん、中国語や韓国語やフランス語のテキストも検索できます。

image01: H.E.のアーキテクチャ
[image01: H.E.のアーキテクチャ]

検索機能の典型はWebインターフェイスによるものでしょう。つまり、Webブラウザに表示された検索フォームに検索条件を入力して検索するものです。H.E.にはiamge02のような画面の検索用インターフェイスがバンドルされています。これはWebサーバ上で動作するCGIスクリプトとして実現されています。既に多くのWebサイトの検索システムとしてH.E.が使われています。なお、スラッシュドットジャパン(†脚注:http://slashdot.jp/)の検索機能にもH.E.が使われています。

image02: 検索画面
[image02: 検索画面]

デモサイトにアクセスすると、様々な機能があることに気づいていただけると思います。AND、OR、NOTといった論理式はもちろん、フレーズ検索やワイルドカードや正規表現もサポートしています。文書につけたタイトルやサイズなどを対象にした属性検索もサポートしています。さらに、類似文書検索や類似文書隠蔽といった高度な機能も搭載しています(†column02)。

column01:転置インデックスの実装

全文検索の最も重要な技術要素は、パターンマッチングを高速化する手法です。パターンマッチングとは、UNIXのgrepコマンドのように、ユーザが指定したパターン(文字列)がどこにあるかを特定する技術です。しかし、grepコマンドのように全ての文書の先頭から末尾までを読み込んで一致判定していく方法では、対象文書が膨大になった場合には時間がかかりすぎて実用になりません。そこで、一般的な全文検索システムでは、どのパターンがどの文書に現れたかという、本のの巻末索引のようなデータベースを使います。このようなデータベースを転置インデックスと言います。

転置インデックスを作るにあたって、対象文書のテキストからどうやってパターンを切り出すかが重要になります。その方法は主に「分かち書き方式」と「N-gram方式」の2種類に大別できます。例えば、「今日は絶好調です」というテキストがあった場合に、分かち書き方式だと「今日」「は」「絶好調」「です」というように単語に着目してパターンを切り出すのに対し、N-gram方式だと「今日」「日は」「は絶」「絶好」「好調」「調で」「です」のように、決まった文字数でパターンを切り出します。両者の比較を表に示します。

分かち書き方式 N-gram方式
検索の速度 速い 遅い
検索の精度 良い 悪い(検索ゴミが多い)
検索の再現率 悪い(検索モレが多い) 良い
インデックスのサイズ 小さい 大きい
言語依存性 強く依存(特定の言語のみ) 非依存(多言語対応)

N-gram方式は検索モレがほとんど起きないという利点があるのですが、速度やサイズの面で非効率なことから大量の文書を扱うことが難しいので、一般的な用途ではあまり使われていませんでした。全文検索システムNamazuは分かち書き方式ですし、GoogleやYahooも分かち書き方式をベースとしているようです。しかし、近年になってコンピュータの性能が上がってきたので、N-gram方式の検索エンジンが数多く開発されてきています。

H.E.は分かち書き方式とN-gram方式の長所を合わせ持ったハイブリッド方式の全文検索システムです。英語のような、もともと空白で分かち書きされている言語に対しては分かち書きでパターンを切り出しますが、日本語のような、空白で単語が区切られない言語に対してはN-gram方式でパターンを切り出します。また、日本語の形態素解析器MeCab(†脚注:http://mecab.sourceforge.jp/)を組み込むこともでき、その場合は日本語に対しても分かち書き方式を適用します。

分かち書きを使ったら検索モレが発生してしまうではないかと心配する方もいるかもしれませんが、安心してください。H.E.では、2階層のインデックスによってその問題に対処しています。分かち書き方式で切り出したパターンを登録した小さなインデックス(補助インデックス)と、N-gram方式で切り出した全てのパターンを登録した大きなインデックス(メインインデックス)を使います。検索時には、先に補助インデックスを検索して、十分な数の文書がヒットしたらそこで検索を終了します。その場合、分かち書きで作ったインデックスの結果なので精度は高いですし、小さいインデックスなので高速に処理できます。もし十分な数がヒットしなかった場合は、メインインデックスも検索して完全な検索結果を生成します。このような仕組みによって、速度と精度と再現率の全てに秀でた全文検索を実現しています。

column02:高度な検索手法

ユーザが入力したパターンに一致するか否かという条件をANDやORといった演算子で組み合わせることによって対象を絞り込んでいく検索モデルを「ブーリアンモデル」と言います。H.E.を含むほとんどの全文検索システムはブーリアンモデルを実装しています。ブーリアンモデルを拡張する手法として、入力されたパターンをシソーラス(関連語)のOR条件に展開する手法や、対象文書にリンクしているアンカーテキストも検索対象にする手法などがあります。シソーラス展開はH.E.でも実装されています。

ブーリアンモデルとは一線を画す検索モデルとして、「ベクトル空間モデル」が挙げられます。対象文書から抽出したキーワードの出現頻度をベクトルの次元に見立て、検索条件のベクトルとの内積やコサインが小さいものを類似文書として提示する手法です。要するに、単語の出現傾向を元に、類似した文書を捜すことができるということです。このモデルはH.E.でも「類似文書検索」として実装されています。検索結果に含まれる文書の「similar」リンクを選択すると、その文書に類似した文書を類似度の順番で並べて表示してくれます。捜そうとしている文書がはっきりしない場合や適切な検索語が思い付かない場合には類似文書検索が便利です。ただし、計算量がブーリアン検索に比べてとても大きいので、ちょっと遅いのが珠に傷です。

H.E.では、ブーリアンモデルにベクトル空間モデルを組み込んだ「類似文書隠蔽」も実装しています。多くの文書を対象とした検索システムの場合、検索結果が同じ内容の文書ばかりに占められて鬱陶しいことがよくあります。そのような場合に類似文書隠蔽が便利です。検索フォームの「clip」の値を設定すると、表示しようとする各々の文書に対して、既に表示された文書との類似度が指定された値以上だった場合に表示を省略するようになります。つまり、内容が似すぎた文書を折り畳んで表示してくれるのです。また、表示した各文書に含まれる頻出語を絞り込み候補として表示する機能もあります。

学術的には、検索精度とは、検索結果に含まれる文書の中にユーザが意図したものがどれだけの割合で含まれるかという尺度であると定義されます。例えば、検索結果が10000件中に意図したものが1000件含まれれば、精度は10%ということになります。しかし、この尺度をそのまま適用して検索システムの善し悪しを計るのはあまり現実的ではありません。10000件の結果の全てに目を通す人はいないでしょうし、たとえ意図した文書であっても1000件のリンクをクリックする人もいないでしょう。現実的には、検索結果の上位50件くらいの中に意図したものが含まれる割合を高めることと、その50件くらいの中にユーザにとって最善のものが入っていなかった場合にできるだけ簡単に再検索ができるようにすることが重要になります。そのような観点で捉えると、類似文書検索や類似文書隠蔽や絞り込み候補表示機能が単なるオマケではないことがお分かりいただけると思います。


簡単な使い方

高性能・高機能なだけでなく、簡単に使えるというのがH.Eのコンセプトです。論より証拠。早速インストールして使ってみましょう。

準備

ここでは、ソースパッケージを使ってUNIX系のシステムにH.E.をインストールする手順を説明します。Windowsの方はcolumn03を御覧ください。

gccやmakeといった開発ツールが既にインストールされていることを前提とします。また、zlib(†脚注:http://www.zlib.net/)とiconv(†脚注:http://www.gnu.org/software/libiconv/)もインストールされていることとします。それらはLinuxやBSDのディストリビューションでは大抵はデフォルトでインストールされています。

QDBMというデータベースライブラリと、H.E.の本体を入手します。以下のサイトからそれぞれの最新版をダウンロードしてください。

ビルドとインストール

先にQDBMをインストールします。QDBMのソースパッケージを展開したディレクトリに入り、以下のコマンドを実行してください。

$ ./configure --enable-zlib --enable-iconv --enable-pthread
$ make
$ su    ← rootユーザになる
# make install

H.E.をインストールします。H.E.のソースパッケージを展開したディレクトリに入り、以下のコマンドを実行してください。

$ ./configure
$ make
$ su    ← rootユーザになる
# make install

特にエラーが出なければインストールは完了です。

Webサイトの検索機能

検索システム構築の典型例として、WebサイトのHTML文書を検索対象にする例を取り上げてみます。WebサーバにApacheを使っていて、「/home/www」というディレクトリの下をWebサイトとして公開しているとしましょう。その場合、以下のコマンドを実行します。作業は、そのディレクトリに書き込み権限のあるユーザで行ってください。そうすると、「/home/www」の下にある全てのHTML文書がインデックスに登録されます。

$ cd /home/www
$ estcmd gather -il ja -sd -cm -cl casket .
$ estcmd extkeys casket

検索用インターフェイスのCGIスクリプトを設置します。以下のコマンドを実行してください。なお、CGI実行の設定についてはApacheのマニュアルを御覧ください。

$ cd /home/www
$ cp /usr/local/libexec/estseek.cgi .
$ cp /usr/local/share/hyperestraier/locale/ja/estseek.* .

上の手順で設置された「estseek.conf」という設定ファイルをエディタで開いて編集します。「replace:」で始まる行は、ローカルなURLをグローバルなURLに置換する設定です。「{{!}}」の前が置換前の文字列(正規表現)で、後ろが置換後の文字列です。

replace: ^file:///home/www{{!}}http://yourhost.yourdomain/
replace: /index\.html?${{!}}/

これで設定は完了です。設置された「estseek.cgi」にブラウザでアクセスしてみてください。デモサイトと同じような画面が表示され、検索できるようになっているはずです。H.E.のマニュアルにはさらに詳しい説明がありますので、そちらも御覧ください。

メールボックスの検索機能

mh形式(1メール=1ファイル)でメールボックスを管理するメーラ(Mew、Wanderlust、Sylpheedなど)を使っているならば、個々のメールを対象にした全文検索のインデックスを簡単に作ることができます。例えば、メールボックスが「/home/mikio/Mail」にあり、その中の businessフォルダかfriendsフォルダに振り分けられたメールを登録する場合、以下のコマンドを実行します。

$ find /home/mikio/Mail -type f | egrep 'inbox/(business|friends)/[0-9]+$' |
>  estcmd gather -cl -fm -cm casket -

作成されたインデックスは、estseek.cgiを使って検索することができます。mh形式以外のメーラをお使いの場合は、mh形式になるようにメールをエクスポートしてください。

column03:Windows版の使い方

Windowsユーザの方はバイナリパッケージを利用すると便利です。以下のURLから最新版を入手してください。

バイナリパッケージには、DLLも含めて、H.E.の動作に必要なファイルの全てが納められていますので、インストールはとても簡単です。ダウンロードしたアーカイブを展開すると、「hyperestraier」というフォルダができますので、それをフォルダごと適当な場所に移動させてください。システムドライブの直下(c:\hyperestraier)にするとわかりやすいかもしれません。あとは、そのフォルダにコマンド検索パス(Path環境変数)を通すだけです。

うまくインストールできているか確かめるために、コマンドプロンプトを立ち上げて、以下のコマンドを実行してみてください。H.E.のバージョン情報が表示されればOKです。

C:\> estcmd version

以下のコマンドを実行すると、「D:\doc」以下にあるPDFとRTFとWordとExcelとPowerPointのファイルをインデックスに登録できます。内部でxdoc2txt(†脚注:http://www31.ocn.ne.jp/~h_ishida/xdoc2txt.html)というフィルタプログラムを呼び出しているので、それが対応している形式であれば拡張子のリストを加えることでインデクシングの対象を広げることができます。

C:\> estcmd gather -cl -fx .pdf,.rtf,.doc,.xls,.ppt T@estxfilt -fz ^
  -ic CP932 -pc CP932 -sd -cm casket D:\doc
C:\> estcmd extkeys casket

以後の手順は本文の説明を御覧ください。WebサーバにはApacheを使ってもいいですし、IISやAn HTTPdでも問題ありません。WindowsサービスとしてWebサーバを実行する場合、Webサーバの実行ユーザがインストール作業を行ったユーザと異なる可能性があることには注意してください。実行ユーザにとってのコマンド検索パスを適切に設定することが必要です。よくわからない場合は、パッケージ内の全てのDLLをCGIスクリプトと同じ場所にコピーするとよいでしょう。


P2Pの分散検索

ここまでの説明で、一般的な検索システムとして便利なところはおわかりいただけたかと思います。しかし、H.E.の真価はさらに先にあります。P2P(ピア・トゥー・ピア)機構による分散処理です。

P2Pによるメタ検索

PCの性能も年々向上してきているとはいえ、PC1台で扱えるインデックスの規模には限界があります。CPUが2GHzでメモリ1GB搭載の一般的なPCの場合、平均3KBのテキストファイルなら100万件くらい、平均1KBのメールなら300万件くらいが実用的に扱える限界でしょう。それ以上の規模の検索システムを運用するならば、インデックスを複数のPCに分けて配置して分散処理を行う必要があります。100万件の文書のインデックスを管理する10個のサーバを連携させれば、1000万件の文書を扱う検索システムを構築することができるというわけです。インデックスを分ける理由は性能だけではありません。文書の形式や内容によって別々のインデックスに分けて登録しておき、必要に応じて選択したインデックスに対して一度に検索できると便利です。

多数のインデックスを管理することを想定した場合、インデックス毎にサーバを起動するのは非効率です。そこで、単一のプロセスおよび単一のポートで複数のインデックスを管轄できる「ノードマスタ」というプログラムが提供されます。ノードマスタ内の個々のインデックスは独立したサービスを提供するので、ノードマスタは複数のサーバの集合体とみなすこともできます。個々のインデックスを管轄する仮想的なサーバを「ノードサーバ」と呼ぶことにします。各ノードサーバには別々のURLが割り当てられます。ユーザが操作するアプリケーションはノードサーバのクライアントとして位置づけられますが、接続先のノードサーバについてはURLだけ知っていればよく、ノードサーバがどのノードマスタ上に存在しているかをアプリケーション側で意識する必要はありません(image03)。

image03: P2Pのアーキテクチャ
[image03:P2Pアーキテクチャ]

ノードサーバは別のノードサーバに対して一方的にリンクを張ることができます。クライアントがノードサーバに検索要求を出した場合、依頼を受けたノードサーバは自分がリンクを張っているノードサーバにもクエリを中継し、返された結果を自分のインデックスの結果とマージしてクライアントに返します。つまり、いわゆるメタ検索機能を全てのノードサーバが持つことによって、P2P型の分散処理を実現しているのです。

このようなアーキテクチャは、インターネット環境で不特定多数のノードが連携して巨大な検索システムを構築することを念頭に置いたものです。個々のノードを管理するユーザは自分が検索したい文書を自分のノードに好きなように登録するとともに、自分の興味と似たノードがあればそこにリンクを張ることで労せずして検索対象を拡張することができます。全てのノードがクライアントともにサーバでもあるというP2Pの構成をとることで、中央集権的にノード間の調整をする人がいなくても自律的にネットワークを成長させることができます。

ノードマスタの使い方

ノードマスタを動作させる準備として、サーバルートディレクトリを作成します。設定ファイルやインデックスなどを格納するディレクトリです。以下のコマンドを実行すると、「casket」というディレクトリが作成されます。

$ estmaster init casket

次に、ノードマスタを起動します。以下のようにします。

$ estmaster start casket

ノードマスタを終了させる場合は、ノードマスタを実行している端末でCtrl-Cを入力するか、別の端末で以下のコマンドを実行します。

$ estmaster stop casket

ノードマスタが起動しているならば、「http://localhost:1978/master_ui」というURLにWebブラウザでアクセスすることで、管理用インターフェイスを使うことができます。アクセスするとユーザ名とパスワードを聞かれるダイアログが出ますので、「admin」「admin」と入力してください。すると、管理用のメニューが表示されます。あとは、メニューに従ってノードサーバを作成してください。

ノードサーバを「test」という名前で作ったとすると、以下のスクリプトを実行することで、「/home/www」以下のHTML文書を登録することができます。

$ find /home/mikio/public_html/doc/ -name '*.html' -print |
> while read file
> do
>   printf '%s\n' "$file"
>   estcmd draft -fh -il ja "$file" |
>   estcall put -auth admin admin http://localhost:1978/node/test
> done

その上で、「http://localhost:1978/node/test/search_ui」にブラウザでアクセスしてください。ノードサーバ組み込みのインターフェイスで登録文書を検索することができます。

P2P機構の課題

P2P型の分散処理機能があると言っても、リンク対象となるノードが世の中でたくさん運用されていないと意味がありません。H.E.自体がまだそれほど普及しているわけではありませんし、P2Pで全文検索エンジンを実現するという文化がインターネットで育っているとも言えません。この野望を実現するには、SNS(ソーシャルネットワークシステム)のような、ノード管理者同士を引き合わせてモチベーションを高める仕組みが必要となるでしょう。それにはどのような制度や機能が必要かを筆者は研究しているところです。何か面白いアイデアがあればぜひお知らせください。

一般のユーザがもっと簡単にノードを運用できるようにするためには、Webサイトやデスクトップの文書を収集してノードサーバに登録するのを自動化する機能が必要です。その設定を簡単に行うためのGUIがあるともっと便利でしょう。そういった機能も現在開発中です。筆者以外にもH.E.のP2P機構のアプリケーションを作っている人がいます。中でもmod_estraierは非常に興味深いものです(column04)。

column04:mod_estraier

H.E.のP2P機構を使った最も面白いアプリケーションとして、mod_estraier(†脚注:http://modestraier.sourceforge.net/)が挙げられるでしょう。これは、Webのプロクシ上を通過した文書を自動的にノードサーバに登録してくれるものです。フォワードプロクシとして使えば、自分が過去に見たWebページに特化した検索システムが簡単に実現できます。会社や学校で同じプロクシを使えば、組織の知的活動を調査するためのデータマイニング手法として用いることもできるでしょう。また、リバースプロクシとして使えば、特定のサイトやWebアプリケーションの文書に特化した検索システムが実現できます。Webアプリケーションが生成した動的なデータであっても、プロクシを通りさえすれば何でも文書として扱えるところが素晴らしいところです(image04)。複数のアプリケーションの扱う文書を統合して検索することも簡単です。mod_estraierを使えば、もはやWebアプリケーション毎に検索機能を実装する必要はなくなるということです。

image04: mod_estraierのアーキテクチャ
[image04:mod_estraierのアーキテクチャ]

フォワードプロクシのデモサイトがありますので、ぜひお試しください。Webブラウザのプロクシとして「athlon64.fsij.org」の「3128」番を設定してください。その状態でどこかのサイトを見ようとすると、認証のダイアログが出るので、ユーザ名に「tako」、パスワードに「ika」を入力してください。そして、いくつかのWebサイトを閲覧してから、以下のURLにアクセスして、適当な語を入れて検索してみてください。先ほど閲覧したサイトがヒットするはずです。


アプリケーション開発のススメ

本誌読者の中には、日常的にプログラミングをしている方や、プログラミングを学んでいる方も多いと思います。そんな皆様には、ぜひともH.E.のライブラリを使っていただきたいと思います。

APIの階層

全文検索システムは私達に大変身近な技術であるにもかかわらず、自分で作ろうとすると非常に多くの手間がかかるものです。しかし、H.E.のライブラリを使えば、実用的な全文検索システムを非常に短い期間で作ることができるでしょう。既に紹介したestcmdコマンドをシェルから呼び出したり、estseek.cgiの設定ファイルをいじるだけでもかなりのカスタマイズができますが、それだけでは不可能だった多くのことが、ライブラリを組み込んだアプリケーションを作ることで可能になります。estcmdではファイルとして存在している文書しか扱えませんでしたが、ライブラリを使えば、リレーショナルデータベースに格納されたレコードを文書として扱うアプリケーションを作ることもできます。estseek.cgiはWebブラウザで使うものでしたが、ライブラリを使えば、ネイティブOSのGUIを備えた検索アプリケーションを作ることもできます。

H.E.のAPIは、抽象度に応じて複数の階層に分けらます(image05)。もっとも低水準の「コアAPI」は、インデックスを直接操作するAPIです。排他制御や堅牢性確保の責任をアプリケーション作者が負わねばならない半面、うまく使えば非常に効率的な処理を行うことができます。estcmdやestseek.cgiはコアAPIを使ったアプリケーションです。その上層の「スレッドAPI」は、スレッド間の排他制御をライブラリ側で行うようにしたラッパーです。P2P機構のノードマスタはスレッドAPIを使ったアプリケーションです。ノードマスタはHTTPプロトコルでリモートから制御することができますが、そのプロトコルの詳細を隠蔽して簡単に扱えるようにしたものが「ノードAPI」です。ノードAPIを使うと、P2P機構を使った大規模な検索システムをとても簡単に作ることができます。

image05: APIの階層
[image05:APIの階層]

上述のAPIはC言語のものですが、JavaやRubyでもH.E.のアプリケーションを開発できるように、コアAPIの言語バインディングが提供されます。これはC言語のライブラリのラッパーとして実現されています。また、ノードAPIに相当する操作をJavaやRubyから行うために、JavaだけやRubyだけで実装されたインターフェイスも提供されます。リスト1は、Ruby用のノードAPIを使って文書登録を行うサンプルプログラムです。こんなに短いコードで独自の全文検索システムが作れるのです。

# Hyper Estraierのライブラリを取り込む
require "estraierpure"
include EstraierPure

# ノードに接続して、アカウント情報を設定する
node = Node::new
node.set_url("http://localhost:1978/node/test")
node.set_auth("admin", "admin")

# 文書オブジェクトを作成して、テキストや属性を設定する
doc = Document::new
doc.add_attr("@uri", "http://foo.bar.baz/quux.html")
doc.add_attr("@title", "OSM今月号")
doc.add_text("今月も盛りだくさんでお届けします。")
doc.add_text("Hyper Estraierの記事が特に面白いです。")

# ノードに文書オブジェクトを登録する
unless node.put_doc(doc)
  STDERR.printf("error: %d\n", node.status)
end

アプリケーションの配布

mod_estraier以外にも様々なアプリケーションが既に公開されています。gdestraier(†脚注:http://www.mitsuki.no-ip.com/~seagull/software-archives/hyperestraier/gdestraier.html)は、GNOMEデスクトップからファイルを検索する、いわゆるデスクトップ検索ツールです。DesktopHE(†脚注:http://freemind.s57.xrea.com/desktophe/)は、同じくWindows上で動作するデスクトップ検索ツールです。PgEstraier(†脚注:http://pgestraier.projects.postgresql.org/)は、PostgreSQLにH.E.を組み込んでSQL文で操作できるようにするモジュールです。

H.E.はGNU LGPLというライセンスで配布されています。これは、H.E.の本体(ライブラリ)自体を改編した場合はそのソースコードを公開する義務が発生するものですが、H.E.のライブラリを組み込んだアプリケーションを開発する際にはソースコードを公開する必要はありません。したがって、一般的な商用のアプリケーションに組み込んだり、システムインテグレーションの案件でも気軽にH.E.を利用することができます。さらに、ノードAPIのRubyとJavaのインターフェイスはBSD風ライセンスで配布されていますので、ライブラリ自体を改編したものを組み込むことも容易です。オープンソースもそうでない製品も含めて、様々なシーンでH.E.が活用されれば本望です。H.E.のメーリングリストではアプリケーション開発に関する質問や相談も受け付けていますので、気兼ね無く投稿してください。