現在特定のサイトを対象とした検索エンジンをPHPベースに作っています。指定したサイトからHTMLタグを取り除きコンテンツを取得しデータベースに格納しているのですが、量が多いためDBに負荷がかかってしまいます。
調べるとGoogleはDBを使用していないようです。
Googleなどの巨大検索エンジンはもとより価格.comや比較.comなど一般企業のクローラはデータをどのように保存し、管理、検索をかけているのでしょうか?
詳細な情報をお願いいたします。
一概に言えないのですが、DBがボトルネックになっているとすると、DBのオプティマイズがちゃんとされていないのかもしれません。検索時の高速性を狙って全部の項目に索引をつけると、登録の度にすごく重くなります。また、ページファイルのようなものをDBに保存しているようなら、これを外部のファイルに保存するようにしてください。DBの設計を一度見直してみては如何でしょうか?
昔Btreeそのものを作っていましたが、索引つきのテーブルに10000件のデータを順次登録するのより、索引のないテーブルに10000件のデータを登録し、その後索引を再構成したほうが早いということが起きます。バッチ処理的な運用が可能なら、このような方法でプログラムすることも可能かもしれません。(ただし普通のSQLを使うというレベルでない難しさがあると思います)
MSSQLの例ですが、考え方は応用できると思います。
http://www.microsoft.com/japan/technet/archive/columns/itpro/rip...
ひょっとして全文を突っ込んだフィールドに対して LIKE 演算子で単純に中間一致検索されていないでしょうか?
単純な中間一致検索は対象のデータを毎回全文嘗め回すので、データ量が増えるとそれに比例して遅くなってしまいます。
そこで、Google その他の全文検索システムでは転置インデックスというデータ構造をあらかじめ作成し、高速に検索できるようにしています。
MySQL や PostgreSQL 等の RDBMS にも全文検索のための転置インデックス作成機能がありますが、日本語に対応していないという問題があります。
そこで、それらで転置インデックスを用いた日本語対応の高速な全文検索を可能にするライブラリとして、Senna があります。
Senna には MySQL と連携するためのパッチが標準でついていますし、PostgreSQL についても NTT データが提供している Ludia を追加することで Senna と連携可能になります。
また、RDBMS との連携機能はありませんが、Hyper Estraier ならクローラも付属していますので、お手軽に全文検索を実現できます。
大変参考になります。ありがとうございます。