japan.internet.comに最新のコラムが掲載されました。
なお、今月からコラム執筆者は開発部大谷さんになりました。
みなさん、よろしくお願いします。
---------------------------
前回から少し時間があいてしまいましたが、今回からこのコラムの執筆者も変わり、今後はもう少し技術的な話やとんがったソフトウェアについて紹介していきます。
今回は、少し毛色を変えて、全文検索技術ソフトウェアの中で、P2P による分散検索を実現する HyperEstraier について紹介してみたいと思います。
■HyperEstraier の概要
HyperEstraier は、情報処理推進機構(IPA)による2004年度第2回未踏ソフトウェア創造事業の支援を受けて開発された全文検索エンジンです。インデックスを使い、大量の文書を効率よく検索することができます。
オープンソースの全文検索エンジンとしては Namazu が有名ですが、 HyperEstraier も、 GNU Lesser General Public License に基づいて配布されるフリーソフトウェアです。ライブラリの形式で実装されていますので、各種アプリケーションに組み込むことが容易にできるという特徴があります。
全文検索のためのインデックスの作成方法は、大きく分けて、形態素解析を使ったわかち書きによる方法と、 Nグラム法よる方法があります。
わかち書きによる方法では、あらかじめ決まった辞書により、キーワードの抽出を行います。このため、辞書にない単語は検索からもれることがあります。一方のNグラム法では、辞書を使わずにインデックスを作成します。このため、インデックスのサイズは大きくなりますが、辞書にない単語でも検索洩れは発生しない特徴があります。
■HyperEstraier の P2P 機能
HyperEstraier のもうひとつの大きな特徴として、 P2P 技術を利用した分散検索機能があります。
HyperEstraier の P2P では、検索を依頼するクライアントと、実際に検索を行うサーバーに分かれています。この仕組自体は今まであるクライアント/サーバーモデルと同一です。
P2P としてネットワークを形成しているのは、 HyperEstraier のサーバー群です。以前、このコラムで紹介したソフトウェアは、クライアントサイドでの P2P の利用が多くありましたが、 HyperEstraier はサーバーサイドでの P2P 技術になります。
クライアントは、HyperEstraier サーバーのひとつに検索を依頼します。サーバーAに依頼した場合は、サーバーAで検索が実行され、同時にサーバーAが接続してるサーバーBやサーバーCに、サーバーAが検索を依頼します。
クライアントは、サーバーAの検索結果と、サーバーBやサーバーCなどの複数のサーバーでの検索結果を、一度に受け取ることができます。
特にこのシステムの特徴が生きるのが、大量の文書を扱う場合です。
検索速度はインデックスのサイズが増えるに従って遅くなっていきます。そのため、1,000万件の文書をひとつのインデックスで処理するより、 100万件ごとに10個のサーバーで同時に検索を行うほうが効率的になります。また、検索処理を実行する時のサーバーの CPU 負荷も分散されるため、効率よく大量の文書を処理することができるようになります。
■経路選択と信頼度
多くの P2P アプリケーションでは、お互いの P2P ノード同士の接続は自動的に行われています。つまり、ユーザーは意識する必要はありませんでした。 HyperEstraier は接続先を明示する必要があります。これは、一般ユーザーが設定しなければいけないクライアントサイドのアプリケーションと違うところです。
また、接続している方向も重要になってきます。サーバーAからサーバーBに接続している場合、サーバーAはサーバーBに検索処理を依頼することができますが、サーバーBはサーバーAに検索処理を依頼することはできません。もちろん、双方向に接続設定をすれば、サーバーBからサーバーAに処理を依頼することが可能になります。
P2P 的であることの利点としては、サーバーAがサーバーBに、サーバーBがサーバーCに接続している場合、サーバーAが検索をサーバーBに依頼すると、続いてサーバーBは接続しているサーバーCに自動的に処理を依頼することができます。サーバーAはサーバーCの存在を知らなくても、必要なサーバー群で検索処理を行うことができます。
サーバーAは他のサーバー群に依頼した検索の結果を受け取ると、すべての結果をマージしてクライアントに検索結果を返します。
検索の順位付けは、全文検索ではとくに重要です。順位付けは、最初に、実際に検索を行ったサーバー上で行われます。サーバーAは他のサーバーに依頼した検索結果をフラットな状態で受け取ります。その後に、各サーバーと自サーバーの間の信頼度係数をもとに、全体の順位付けを調整していきます。
インターネットでの分散検索アプリケーションを実装した場合、スパム的な情報を提供するサーバーなどは、信頼度を低くすることで、検索結果の順位が低くなり、最終的には、P2P ネットワークから事実上排除することができるようになります。
相手ノードとの信頼度は、クライアントとサーバーAの間で、ユーザーからのフィードバックを元に自動的に重みづけされていきます。フィードバック自体は、 HyperEstraier ではなく、それを利用して作成されたアプリケーションが行う必要があります。フィードバックは、ユーザーがそのファイルを開くという処理でも実現できます。また、ボタンを押して評価を設定するなど、明示的なアクションで行うこともできます。
このようにサーバーサイドで利用される P2P システムは、クライアントサイドの P2P とは一味違ったものがあります。次回は、この HyperEstraier を利用して開発が進められている mod_estraier について紹介してみます。(執筆:大谷 弘喜)