SUZAKU : The Internet Search Engine

SUZAKU : The Internet Search Engine
SUZAKUとは
「SUZAKUはもともと、「特定分野のホームページの検索を行うプライベート・サーチエンジンを構築し、外部に公開する」目的のために開発しました。」
というものです。
かつてこんなことを書いたことがあります。
「全文検索システムは基本的に3つの部分から成り立っています。
 1,検索データの収集
 2,検索
 3,検索結果の表示
 このうち、検索データの収集は自分のサイトにシステムを作るなら全く無視してよい項目です。検索対象のデータは全て自分の手元にあるのですから、ポイントは2と3、特に検索エンジンの仕様が最大の関心事です。
YAHOOに代表されるようなサーチエンジンを構築しようとすると、ここのアルゴリズムが重要になります。最近評判の「Google」はここの方法論が出色なんですね。もっとも、ユング君にはその辺の技術論的なことはよく分からないし、そんな世界にまで踏み込むことは永遠にないだろうと思います。」
ところが、この「SUZAKU」というシステムに出会って、永遠に踏み込むことはないだろうと思った「サーチエンジン」の世界に踏み込んでみようと思ってしまったのです。
結論から言いますと、まさにこの一週間「泥沼」にはまりこんでしまいました。これほど苦労させられた経験は他には思い当たりません。
仕事から帰ってくると、暇な時間はほとんどこの作業につぎ込んでいたのですが、とにかく前提となるソフトの導入に手こずってしまい四苦八苦させられました。
その最大の原因は、データーベースに「MySQL 4.1.x」を指定していて、「MySQL 3.x/4.0、では正常に動作しません。」と言うところにつきます。
MySQLを使ったことがある人なら、「なるほど・・・。」と納得していただけると思います。この辺のすったもんだは役にたつ部分もあると思いますので、時間があれば備忘録的に書いてみたいと思います。
しかし、そのすったもんだの末にできあがったシステムはエクセレントの一言です。
とりわけ、ユング君のように特定の分野に絞り込んだサイトにとっては非常に価値のあるサーチエンジンができそうです。
試験的にクラシック音楽関連の有名サイトを10前後登録して走らせてみたのですが、半日ほどかけて1000をこえるページをひろってきました。そして、それをもとにあれこれ検索をかけて使い勝手を確かめてみたのですが、まさにピンポイントで情報を拾ってきます。もともとが手動で特定のジャンルの値打ちのあるサイトしかロボットを走らせていないのですから、当然と言えば当然です。
スクリプトの開発者は500?1000程度のサイトにロボットを走らせることを想定しているようですが、特定のジャンルでそれだけのサイトにロボットを走らせれば、国内サイトに存在する価値ある情報はほとんど網羅できるのではないかと思います。
ただし、現在はこれを開発用のサーバーでいたぶっている段階なのですが、これを実際に運用しているサーバーで稼働させるとなると少しばかり決断が必要です。おそらくは少しははサーバーを止めて作業をしないといけないかもしれません。ただし、それだけの値打ちはありそうなので、ここはしばらく沈思黙考です。
<開発者による「SUZAKU 開発の経緯」>
設計・開発にあたっての要件は、以下のようなものでした。
1. 500?1000サイト程度のホームページを対象に、実用的な速度で全文検索ができる。
2. google等のサーチエンジンに類似した、分かりやすいユーザーインタフェース。
3. 対象となるホームページの情報収集を自動的に行う(ロボット型のサーチエンジン)。
4. 対象となるホームページの情報収集を、そのサイト内に制限できる。
(LINKを探索する際、直接関係ない他のサイトのホームページの情報まで収集しないように制御できる。)
5. できれば毎日、遅くとも2?3日おきには、登録した全ホームページの更新状況をチェックし、検索用データベースを最新状態に更新できる。
6. 5.を実現するため、追加・変更・削除されたホームページの情報だけ、検索用のデータベースに対して差分更新する。
7. 情報収集の処理中(検索用データベースの更新中)でも、検索できる。
(ノンストップ運用)
8. 対象となるホームページの登録・削除が簡単にできる。
9. 対象となるホームページ側に迷惑をかけない。
(集中的なアクセスを避ける、robots.txtによる探索制限に従うなど)
10. サンデープログラマが個人で、短期間に開発できる。
11. 少ないリソースで運用できる。
12. 少ない費用で運用できる。
もっとも、最初は自前でシステム開発するつもりはなく、既存のフリーの全文検索システムとWebページのダウンロードツールで実現できないかと考えました。具体的にはNamazuとwgetを組み合わせて出来ないかを検討したのですが、Namazuに関しては(6)データの差分更新、(7)情報収集の処理中の検索続行が、wgetに関しては(9)相手側に迷惑をかけないの実現が難しいことが分かり、このアプローチは断念しました。
 どうしたものかと考えていた時、 WEB+DB PRESS Vol.2(2001年5月発売)という雑誌に、「Web検索サイトの開発」という記事が掲載されました。これは、PHP、Perl、MySQLを使って、簡単なロボット型サーチエンジンを作るというものでした。読んでみると、基本的な部分をどう作ればいいか、具体的にイメージすることができました。この記事がきっかけとなって、私は、(無謀にも)自分でサーチエンジンを作るという試みに挑戦することになりました。
 私は、C++を使ったWindows上でのプログラム開発経験はそれなりにあったのですが、ネットワーク系のプログラムや、本格的なCGIプログラムの開発はやったことがありませんでした。そこで、まずはPerlやPHPの勉強を始めたのですが、PerlやPHPの言語仕様はどうにもしっくりきません。オブジェクト指向言語で、ネットワーク系のプログラムやCGIの開発に適していて、テキスト処理の開発生産性が高く、かつ仕様の美しい言語はないか? いろいろと探してみたところ、私はRubyという言語に注目しました。Rubyは、徹底したオブジェクト指向のスクリプト言語で、正規表現をはじめとするテキスト処理に役立つ豊富な機能を持ち、ネットワーク関係のライブラリも充実していました。私は、今回の開発言語としてRubyを採用することにしました。
 ロボット型のサーチエンジンは、ホームページの情報を収集してデータベース化するロボット部分と、指定されたキーワードでデータベースを検索する検索エンジン部分の大きく2つの機能からなります。
* ロボット部分は、リンクをたどってインターネットを自動的に巡回し、ホームページをダウンロードする部分と、ダウンロードしたホームページの内容を分析してデータベースに格納する部分からなります。後者では、データベースに対して大量のデータ追加が発生します。
* 検索エンジン部分は、ブラウザからキーワードを指定したり、結果をブラウザに表示したりするCGIの部分と、データベースからキーワードを含むホームページのURLを検索する検索エンジン本体からなります。後者では、大量データの高速な検索処理が必要となります。
 データベースの処理部分を、Rubyのようなスクリプト言語で実装するのは、処理速度の面で非常に不利です。かといって、CやC++のような言語で実装するのは、開発規模が大きくなり、完成までのハードルが非常に高くなります。私は、この部分をフリーのデータベースシステム、具体的にはMySQLに全面的に任せられないかと考えました。
 MySQLは、大量データの高速な検索処理が可能なデータベースと言われていました。とはいっても最初は十分な性能が得られるかどうか不安だったのですが、プロトタイプを作ってテストしたところ、十分に実用的な性能が得られる感触を持ちました。もう一つの代表的なフリーのデータベースシステムである PostgreSQLとの比較も行ってみましたが、MySQLは今回重要な大量データのSelect(検索)/Insert(追加)処理に関して、 PostgreSQLの約5倍高速に処理できることが分かりました。ということで、データベース部分にはMySQLを採用することにしました。データベースシステムの採用により、処理内容やデータ構造の変更にも比較的柔軟に対応することができるようになり、また、開発量が減って非常にコンパクトなシステムを実現することができました。
 約3ヶ月間、週末をプログラム開発にあてて、2001年8月にはベータバージョンが完成し、試験運用に入りました。
 このシステムは、RubyやMySQLといったオープンソースのソフトウェアを活用したシステムですので、それらに感謝の気持ちを込めて、またソフトウェア開発に携わる者としてオープンソースの世界に少しでも貢献したいという気持ちから、SUZAKUもオープンソースのソフトウェアとして公開することにしました。公開に向けて、システムの設定機能やユーザーインタフェース、管理機能の完成度アップのための開発を行い、2002年12月に公開用システムのバージョン1.0が完成しました。公開に際して、システムの名称を、SUZAKU(朱雀)と命名しました。
 2005年3月には、ruby 1.8やMySQL 4.1に対応したバージョン2.0をリリースしました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です