オープンソースな検索エンジン Nutch のインストールから設定まで
本家サイト+α †
本家サイトはこちら http://www.nutch.org/
開発者向けページはこちら http://www.nutch.org/docs/en/developers.html
このページの前半戦の参考ページはこちら http://www.nutch.org/docs/en/tutorial.html
うちのサーバーで動いてるサンプル http://nutch.happy-camper.st/
6時間おきに新しいページを求めてネット上を徘徊して回ります。
2004/02/18
1日1回に変更。
1回のデータ更新で、3時間ほど費やされたら、1日の半分は巡回してることになる。
結構データもたまってるみたいだしね。
韓国人のLEEさんが立ち上げている、Nutchサポートサイト http://www.nutch.jp/
インストール †
まずはインストールと行きましょう。
ただし、この状態では日本語は使えません。
まず動かしてみたい人はこのまま読み進めて、日本語環境を整えてから、という人は次の章を先に読んでください。
この部分は、http://www.nutch.org/docs/en/tutorial.html の和訳+αになっています。
誤訳や意味不明の場合は mailto:ueshin@happy-camper.st までご連絡ください。
動作環境 †
- Java 1.4.x (Linuxを推奨)
- Apache Tomcat 4.x
- Win32では、shellを使うために、cygwin (もしCVSをWin32上で使うつもりなら、インストール時にcvsとopensshパッケージを選択する。それぞれ、"Devel"、"Net"カテゴリーにある。)
- ディスク容量1GB程度、高速回線、1時間ほど、など
でも、日本語環境に辿り着くまでは、直接ソースをいじくらないといけないところがあるので、結構時間がかかる。
ことはじめ †
始めに、Nutchコードのコピーを持ってくる。http://www.nutch.org/release/ からダウンロードして、解凍、そのディレクトリへ移動。もしくは、CVSから最新ソースコードをチェックアウトして、Antでビルドする。(後々日本語環境を構築するためには、CVSで最新版を取ってこないといけません。)
CVSからビルド
> cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/nutch login
> cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/nutch co nutch
> cd nutch
> ant
こんな感じだったかな?
次のコマンドを試してみる:
> bin/nutch
これは Nutchコマンドの使い方を表示する。
コンセプト †
Nutchのデータは、2種類ある:
- Webデータベース。Nutchの知る全てのページとそれぞれのリンクについての情報を持つ。
- 断片の集合。それぞれの断片は、取得し、まとまりとしてインデックスをつけたページの集合。Segmentデータは、次のようなタイプから成る。
- fetchlistは、取得するページを示すファイル
- fetcher outputは、取得したページを含むファイルの集まり
- indexは、fetcher outputの、Lucene形式のインデックス
以降の例では、Webデータベースをdb、Segmentをsegmentsというディレクトリに入れることにする。
> mkdir db
> mkdir segments
後々のために
この2つのディレクトリ、antが吐き出すビルドディレクトリには置いておかない方がいいです。
> ant clean
なんてやった日にゃ、せっかく集めたデータを全て綺麗サッパリまるっとお見通し・・・じゃなくて、消されてしまうので。
別のところに置いておいて、シンボリックリンクなんぞで手元に持ってきたほうが良いです。
ただし、ant clean の前に必ずリンクを外しておかないと、リンク先(つまりデータ)をまるっと消しちゃいます。
Webデータベースのブート †
adminツールを使って新しい空データベースを作る:
> bin/nutch admin db -create
injectorは、URLをデータベースに追加する。DMOZ Open DirectoryにあるURLを入れてみよう。まずDMOZページのリストファイルをダウンロードして解凍しなければならない。(これは200MB以上あるファイルなので、ちょっと時間がかかる。)
> wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz
> gunzip content.rdf.u8.gz
次に、これらのページの適当な部分をWebデータベースに入れる。(私達は、ランダムな部分を使うことで、このチュートリアルを実行する人がみんな同じサイトを叩かないようにしている。) DMOZは、約300万のURLを持つ。この中から、3000毎に1つ、つまり1000個ほどのURLを入れる。
> bin/nutch inject db -dmozfile content.rdf.u8 -subset 3000
ファイルを全て解析するので、またちょっと時間がかかる。
これで1000個ほどの未取得URLを持つWebデータベースを手に入れた。
特定のURLからデータベースを開始する
自分のページからリンクを辿って、検索エンジンにデータを蓄えたい、という人(実は僕)向け。
-urlfileというオプションがあるから、これを利用する。
> echo http://ueshin.happy-camper.st/ > urlfile.txt
> bin/nutch inject db -urlfile urlfile.txt
これで、ここで指定したURLを基点とするデータベースができる。
ページを取ってくる †
ページを取ってくるために、まずデータベースからfetchlistを作る:
> bin/nutch generate db segments
これは、取ってくる予定になっている全てのページの fetchlist を作る。fetchlistは、新たにセグメントディレクトリを作り、そこに置かれる。セグメントディレクトリ名は、それが作られた時刻とする。このセグメント名を、シェル変数 s1 に保持する:
> s1=`ls -d segments/2* | tail -1`
> echo $s1
このセグメントに対して、fetcherを起動する:
> bin/nutch fetch $s1
終わったら、この結果をデータベースに反映する:
> bin/nutch updatedb db $s1
これでデータベースは、始めの集合が示していたページ全てのエントリーを持った。
次に、データベースのリンク解析を5回繰り返し実行して、次に取ってくるページの優先順位を決める:
> bin/nutch analyze db 5
さて、トップスコア1000ページの新しいセグメントを取ってくる:
> bin/nutch generate db segments -topN 1000
> s2=`ls -d segments/2* | tail -1`
> echo $s2
> bin/nutch fetch $s2
> bin/nutch updatedb db $s2
> bin/nutch analyze db 2
はい、もう1回:
> bin/nutch generate db segments -topN 1000
> s3=`ls -d segments/2* | tail -1`
> echo $s3
> bin/nutch fetch $s3
> bin/nutch updatedb db $s3
> bin/nutch analyze db 2
この時点で数千のページを取ってきた。さぁ、インデックスをつけよう!
インデックスをつける †
それぞれのセグメントにインデックスをつけるため、indexコマンドを使う:
> bin/nutch index $s1
> bin/nutch index $s2
> bin/nutch index $s3
それから、検索する前に、重複したページを消す必要がある:
> bin/nutch dedup segments dedup.tmp
検索の準備完了!
検索する †
検索するには、Nutch warファイルをサーブレットコンテナに置けばいい。
NutchリリースをダウンロードしないでCVSのソースをチェックアウトしたのなら、まずwarファイルをビルドする必要がある。
> ant war
Tomcatが ~/local/tomcat にあるとすると、次のコマンドでNutch warファイルをインストールできる:
> rm -rf ~/local/tomcat/webapps/ROOT*
> cp nutch*.war ~/local/tomcat/webapps/ROOT.war
webappは、Tomcatを起動したところからの相対パス、./segmentsからインデックスを探すので、ディレクトリを移らずに、次のコマンドを与える:
> ~/local/tomcat/bin/catalina.sh start
それから、http://localhost:8080/ にアクセス、and have fun!
と行きたいところだが
日本語の環境からアクセスしても、多分白紙のページが表示されるでしょう。
これをきちんと表示させるには、以下に書く修正が必要になるのです。
日本語環境の構築 †
表示、検索キーを日本語化するには、以下のようにする必要があります。
ただし、検索するときに日本語を使っても、正しく単語を読み取ってくれません。
例えば、「あいうえお」で検索すると、「あ」「い」「う」「え」「お」という5つの単語として認識されます。
この辺りの解決策は、そのうち対応されるかもしれませんが、調べてみます。
わかったら引き続き追記していきますので、今のところはこれでご勘弁を!
以下では、CVSからソースコードを取ってきたものとします。
CVSからファイルを取ってくる方法は、上に書いてあります。
日本語ロケールのためのディレクトリ名修正 †
注意
以降の説明中では、Nutchをインストールしてあるディレクトリを、$NUTCH_HOME と書きます。
また、基本的に、$NUTCH_HOMEをカレントディレクトリとします。
Nutchでは、ブラウザの送信する Accept-Language ヘッダーを使ってロケールの判別をします。
これにより取得できるロケールは、jaですが、Nutchのデフォルトではjpになっているため、日本語へのリダイレクトが上手くいきません。
そこで、日本語用に割り当てられている jpというディレクトリを、jaに変更します。
> mv docs/jp docs/ja
> mv src/web/include/jp src/web/include/ja
> mv src/web/pages/jp src/web/pages/ja
jpを参照しているファイルをそれぞれjaに変更
変更が必要なファイルは、以下
build.xml 234行目辺り
src/web/style/nutch-header.xsl 29行目辺り
日本語ロケール用プロパティファイルを作る †
検索結果を表示するページでは、プロパティファイルを使って各言語の表示をしています。
日本語用のプロパティファイルはまだ作られていないようですので、手前で作ります。
ファイル $NUTCH_HOME/src/web/locale/org/nutch/jsp/.search_ja.properties
title = 検索結果
search = 検索
hits = <b>{0}-{1}</b>件目 ({2}件中):
cached = キャッシュ
explain = 解説
anchors = アンカー
next = 次へ
( = の後はお好みでどうぞ。)
> native2ascii .search_ja.properties > search_ja.properties
jspの出力文字エンコードを utf-8 に統一する †
なぜか、.jspファイル達のエンコード指定がなされていません。
ま、ASCIIですんじゃう人たちには、エンコード指定しなくても関係ないからかもしれません。.
それぞれの .jspファイルの pageディレクティブに、 contentType="text/html; charset=utf-8" を追加。
さらに、入力パラメータもutf-8にするため、request.setCharacterEncoding?("utf-8"); を、スクリプトレットの先頭に追加。
変更が必要なファイルは、以下
$NUTCH_HOME/src/web/jsp/内の、anchors.jsp、cached.jsp、explain.jsp、index.jsp、search.jsp
search.jsp に関しては、さらに以下のように修正
40行目辺り.
<i18n:bundle baseName="org.nutch.jsp.search" changeResponseLocale?="false"/>
100行目辺り.
<%=URLEncoder.encode(queryString, "utf-8")%>">
リビルド . [#xf6f85a3] †
ここまできたら、1度リビルドして、tomcatにマウントしてしまいましょう。
上記 http://ueshin.happy-camper.st/wiki/index.jsp?pid=Nutch%B8%A1%BA%F7%A5%A8%A5%F3%A5%B8%A5%F3#i8 を参考に。.
tomcatを再起動したら、nutchにアクセス、デプロイします。
検索結果のヘッダ部 †
検索結果のヘッダ部は、ビルド途中にXSLTで生成されるんだけど、なぜかこれだけが文字化けを直せませんでした。
なので、これだけ最後に手動で編集します。.
上記のサンプルで言えば、~/local/tomcat/webapps/ROOT/ja/include/header.html の、それぞれ該当する部分だけをエンティティで表現するように編集。
なにやらワケワカラン文字化けしたHTMLになってるかもしれませんが、よく読めばわかります。.
Nutchについて → Nutchについて
よくある質問 → よくある質問
開発者 → 開発者
寄付 → 寄付
おめでとうございます!
ここまでくれば、とりあえず見た目だけでも日本語環境にすることができました!.
後は、インデックス化の際、検索クエリー、検索結果などにきちんとマルチバイト文字列を認識することができるようになればカンペキです!.
・・・が、これに関しては本格的な開発となってきますので、世界の賢い人たちにお任せいたします。...
それでは、ごきげんよ〜〜〜!!
,.