Apache Nutch はオープンソースの Web 検索エンジン。
今年になってバージョン 1.0 が出て、Apache の TLP(トップレベルプロジェクト) になった。現在最新は v1.2。
乱暴に言うと、「検索エンジン 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資料でまちまちの用語が使われているため、普通に読むと混乱する(……)。
- http://wiki.apache.org/nutch/Presentations?action=AttachFile&do=view&target=apachecon09.pdf
- http://sunset.usc.edu/classes/cs572_2010/Introduction_to_Nutch.ppt
というわけで、以下は 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 を使って内容確認できる。
- http://code.google.com/p/luke/
- lukeall-1.0.1.jar が全部入り Executable jar なので、ダウンロードして開けばよい。
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 に手を出してみた動機。