オープンソース Web 検索エンジン Apache Nutch の概要


Apache Nutch はオープンソースの Web 検索エンジン
今年になってバージョン 1.0 が出て、Apache の TLP(トップレベルプロジェクト) になった。現在最新は v1.2。

Apache Nutch
http://nutch.apache.org/

乱暴に言うと、「検索エンジン Lucene全文検索 Solr + Web クローラー+スコアリング(Page Rank)+分散実行の仕組み」が Nutch。
ちなみに検索インデックスを作成&格納するための mapper / reducer および分散ファイルシステムが Nutch から spin out したのが話題の Hadoop
の割りには知名度が低い気がするのは、Web 検索エンジンを作りたいという要求が少ないせい?(サイト内全文検索なら Solr でいい)
プラグインの組み合わせで virtical search を作りやすそうになっている。「 R 専用の検索エンジンが欲しい!」などのような専門別の検索エンジンを作りたい場合には、 Nutch は非常に有効なんじゃあないかな。


ただ、ドキュメントが大変残念なことになっていて、英語ですらろくなものがない状態。
FrontPage - Nutch Wiki が本家のドキュメント Wiki だが、実質1ページ目の Features に載っている Q&A では、Answer が?だらけ疑問だらけ。いや、こっちに聞かれても(苦笑)。
Web 上で検索して見つかる Nutch の情報のほとんども v0.9 以前のもの。そのまま使えない部分がところどころにあって、こちらも悩ましい。


Nutch の概要を掴むには、ApacheCon などでの以下の発表資料が一番よさそうなんだけど、この2資料でまちまちの用語が使われているため、普通に読むと混乱する(……)。

というわけで、以下は Apache Nutch の構成概要。間違いがあればご指摘歓迎。

Nutch のストレージ

Nutch には crawl db, link db, segments(別名 shards) の3種類のストレージと index/indexes がある。
これらは Hadoop HDFS を使って分散配置することも可能だが、ここでは特にそれについては触れない。

  • crawl db : クロール用のスケジュール情報
  • link db : リンクグラフ。スコアリングの計算用
  • segments : リソース本体(本文、スニペット、各種中間リソースも含む)
  • index : 検索インデックス
  • indexes : インデックスの増分(クロール時に作成後、index にマージする)


link db と segments の内容確認は nutch_readdb, nutch_segread によって可能なはず(まだ試してない)


index は Lucene のインデックスなので、Lucene のインデックス管理 GUI ツール luke を使って内容確認できる。

Nutch の動作(クローラー&パーサー&インデクサ)

nutch_crawl は seed url を元にクロールしてパースしてインデックスを生成する、という一連の処理を自動的に行う。

ApacheCon などの資料と nutch_crawl の実際の動作を元に、Nutch によるインデックス作成の流れをまとめてみた。
用語がドキュメントによって異なる&資料と nutch_crawl の実際の動作とに食い違いがあるので、勘違いや間違いがあるかも。?付きは一部推測。確認するにはソース読むしか。

  • 1. inject : seed url を webdb(crawl db 内のテーブル?) と link db(vertex として?) に追加
  • 2. generate : webdb から fetchlist(segments の中の中間リソース?)を生成
  • 3. fetch : (fetchlist に従って?)コンテンツを取得し、segments に格納
  • 4. parse : segment のコンテンツをパース。 mime type ごとに異なるパーサが呼ばれる(Apache Tika)
  • 5. update crawldb : ドキュメント無し(parse により得たリンク先を webdb に追加? 各種フィルタプラグインによりスパムページなどの除去もここで行っている?)
  • 6. webdb が空 でなければ 2. に戻る
  • 7. update linkdb : fetcher (と parser?)の出力から link db を更新する
  • 8. index : 個々の segment からインデックスを生成して indexes に格納
  • 9. Dedup : 重複ドキュメント(例: asahi.com と www.asahi.com とか) を除去
  • 10. IndexMerger : 更新分のインデックス(indexes)を index にマージ

fetcher は並列実行が可能。また indexer は Hadoop 上で動かすことも可能。


ところで、Nutch には様々な機能をプラグインで追加することが出来る。Web ページの言語判定を行って、検索キーに言語を指定できるようにするのもその一つ。
が、その言語判定プラグインが対応している言語はデンマーク語、ドイツ語、ギリシャ語、英語、スペイン語フィンランド語、フランス語、ハンガリー語、イタリア語、オランダ語ポーランド語、ポルトガル語、ロシア語、スウェーデン語の14カ国語なので、それ以外の言語は基本的にアウト。要はヨーロッパ周辺の言葉だけしか対応していないってこと。
なので、以前開発した49カ国語対応言語判定ライブラリで Nutch 用の言語判定プラグインを作れば、日本語、中国語、韓国語、アラビア語、ヒンディー、……、アジア系言語が軒並みサポートされて、結構なかなか嬉しいんじゃあないか、というのが Apache Nutch に手を出してみた動機。


というわけで、次は Nutch のプラグイン周りの仕組みの解説や、言語判定プラグインを有効にする方法について。