大規模データアプリケーションの開発 その2
この章の内容の一部に、編集部側の理解不足がございました。伊藤氏が、下記エントリーにてご指摘いただいてるので、併せてご確認ください。
- CodeZineにてKOF 2008の記事と補足:Hatena Diary naoya
例3-1:全文検索用の転置インデックス
新しいはてなブックマークでは全文検索を導入しており、かなり大量のデータを検索する必要がある。さらに、単に時系列順に表示するのではなく「『いい感じ』の文書を上位にしたい、しかも高速に検索したい」となると、RDB検索では最早不可能に近くなるので、情報検索のアルゴリズムをしっかり活用しなくてはいけないという。
具体的には、RDBのデータをバッチで取得して、転置インデックスを作成する。あらかじめ検索されるであろうキーワードで「索引」を作るという方法を採用している。RDBMSと同じことを自前でやるわけだ。「あらかじめ検索されるであろうキーワード」は、MeCabで分かち書きするなどして用意しているという。
転置インデックスを利用すると、大規模データを高速に検索できるだけでなく、アルゴリズムを工夫してやればランク付けされた検索(ranked retrieval)、つまりスコアリングして『いい感じ』の文章を抽出できる。このスコアリングの設計と実装が肝のようだ。
転置インデックスでは、ソートされていることが非常に重要だという。ドキュメントをID順に並べておくとID番号の差分を取って、デルタ圧縮という手法でデータを小さく持つことができる。データを小さく持てれば、ディスク上で占める領域が小さくなり、ディスクI/Oでディスクにアクセスする回数が減る。
従来は、ディスク上のサイズを小さくすること自体が圧縮の目的だったが、最近はそれによってディスクアクセスを減らし、I/O負荷を減らすことが焦点になっているという。
例3-2:検索結果のスコアリング
転置インデックスのpostings listからIDを取ってきただけでは、どれがいま自分が1番欲しいドキュメントか分からないため、スコアリングが必要になる。
はてなでは「ベクトル空間モデル」という手法を用いている。クエリやドキュメントをベクトル化して、ベクトル空間上でどのドキュメントのベクトルが近いかを計算し、検索のスコアリングを行う。検索の基盤になる技術だ。
「ベクトル空間モデルは、古典的で理論的な裏づけが弱いモデルだが、十分にうまく動作し、しかも速い。より正確で理論的な裏づけも強い確率モデルなどもあるが、ユーザービリティの面で長があるベクトル空間モデルが、最近は大抵のWeb検索エンジンのベースになっている」と伊藤氏は説明する。
ベクトル空間モデルでは、辞書の単語数次元の内積を大量に計算しなくてはならない。辞書にあってもそのドキュメントに登場しない単語は出現確率がゼロになることから、ゼロがたくさんある行列を計算する古典的なアルゴリズムは確立されており、計算コストを下げることができる。
例3-3:その他の技術
ベクトル空間モデルでは、辞書に含まれてない単語は探せない。例えば、新人アイドルが突然大ブレイクすると、辞書に掲載されるまでは検索漏れが発生することになる。これを補うために「Compressed Suffix Arrays」という部分文字列検索の技術を利用している。これは、戦略提携する株式会社プリファードインフラストラクチャーの検索エンジン「Sedue」によって実現している。
また、サーバー1台で処理しきれないような大量なデータを解析する際には、Googleが考案した「MapReduce」という複数サーバー技術で並列分散処理している。具体的には、Yahoo!が実装した大規模分散計算フレームワーク「Hadoop」により、タスクをメモリ中で処理できるよう細切れにして、ディスクを使わないでメモリで処理するという。
理論と実践
大規模データの扱いは、理論と実践が両面から絡み合っている。実際、MySQLで「JOINを使わない」ことはバッドノウハウで、RDBの教科書には載ってない。大学に行って教科書に「JOINを使うな」と書いてあったりしたら大変なことになる。
一方で、ベクトル計算で検索をするのは古典的な理論だ。「多くの問題は古典的な理論に帰着する」と伊藤氏が語るとおり、古典的な理論は計算時間的に最適化され、カリカリにチューニングされている場合が多いので、大抵そのまま使える。最新の理論ではなく、よく知られている理論を使えばよい。
1番重要なことは、理論やバッドノウハウを蓄積することではなく、それを実践に結びつけることだ。何か実現したいことがあるときに、それが計算機の問題ではどうなるのかと置き換えてやることができるか。その道筋を発見するところが、最も難しい。
例えば、キーワードでリンクしたいということを誰かが思いついたときに、『TrieでCommon Prefix Search、分かち書きの世界』という技術的な問題に帰結できるかどうか。それでサーバーの計算量が決まってくる。それこそ会社の持つ「技術力」なのだ、と全体を締めくくった。
- KOF 2008 の発表資料:Hatena Diary naoya
伊藤氏が補足エントリーを書いて下さいました。本稿で伝わり辛い点などを補足して頂けているので、併せてご覧下さい。
- CodeZine にて KOF 2008 の記事と補足:Hatena Diary naoya
