S2RobotにTikaを入れる

S2RobotのExtractorとMimeTypeHelperを自前で実装していたけど、この中身の実装を Apache Tika に変更することにした。Tika は Lucene のサブプロジェクトで MimeType の取得やファイルから文字列情報を取り出したりする機能を持つ(S2Robotでも実装していたやつね)。Tika を使った方が良いと思った理由はMimeタイプの評価がかなり強力な点。activation だとファイル名くらいしかみないけど、Tika はファイルの中身を評価して返してくる。というわけで、採用することにした。

で、Tika だけど、ドキュメント=ソースみたいな状況(英語の情報すらないような気もする)。使い方とか見当たらん。というわけで、ソースを見ていったのだけど、TikaCLI を見るとなんとなく分かる。AutoDetectParser を new して、Hander と Metadata があればファイルから文字列情報を抜き出してくれる。S2Robotに書いたコードを抜き出すと、

Metadata metadata = new Metadata();
// 別に以下を入れないでも良い。
metadata.set(Metadata.RESOURCE_NAME_KEY, resourceName);
metadata.set(Metadata.CONTENT_TYPE, contentType);
Parser parser = new AutoDetectParser();
StringWriter writer = new StringWriter();
try {
parser.parse(in, new BodyContentHandler(writer), metadata);
} catch (Exception e) {
throw new ExtractException("Could not extract a content.", e);
}
// この段階で writer にファイル内のコンテンツが保存されている
// メタデータが欲しければ
String[] names = metadata.names();
for (String name : names) {
System.out.println(name+": "+metadata.get(name));
}

という感じ。Mimeタイプの判定に利用されるファイルはtika-coreのjarに含まれる org/apache/tika/mime/tika-mimetypes.xml になる。コンテンツ取得で利用される(つまりパーサの定義)はorg/apache/tika/tika-config.xmlになる。渡すMetadataは結果のメータデータも格納される(渡すときに入っていれば補助的な感じで利用されると思う)。handler はStSAXみたいだけど、別にXMLファイルじゃなくても、このhandler で呼ばれて処理されるようだ。

Nutch

てっきり、Nutch は活動が止まったのかと思っていたのだけど、3月にリリースされていたのね。Nutch がなくなったと思ったから、自分で Fess を作り始めたのだけどな…。まぁ、Fess はカスタマイズ性の高さという意味で、ちょっと目指すところが異なるから、Fess自体は進めるのだけど。それは置いておいて、Nutch のクロール部分をどうしているのか気になったから、ちょっと見てみたら、import しているパッケージに Hadoop の MapReduce があるっぽいな。S2Robot では自前でスレッド管理してやっているから、それらを MapReduce で処理するコードはちょっと気になるところ。ちょっと重い話だから、時間があるときに見てみよ。

2.2リリース近い

昨日が締切りで Jetspeed 2.2 リリースの Vote があった。このリリースに対してはほとんどコミットしてない気がするけど(すまぬ…)、時間的にかなり一杯一杯になりながらもインストールしてちょろっと確認して、まぁ、大きな問題はないので、+1 しておいた(PALポータルは修正したけど、インストーラの文字化け(antinstallerがだめ)は何とかしてあげた方がいいな)。そんなわけで、近いうちにリリースされることでしょう。