S2Robot も 0.1.0 のリリースに必要なところは直し、現在、Fess に入れてテスト中。今のところ、問題がないと思うので近日中にリリースすると思う。Fessについてもいろいろと改良を加えた。S2Robotはマルチスレッドで動くけど、Fess 内ではS2Robotを複数のインスタンス立ち上げてクロールさせたりしている(という感じで、すんごいマルチスレッドな感じになっている気がしている)。対応フォーマットについてもTika を導入したので、柔軟にいろんなファイルが処理できるようになった。Fess についても、まだ加えたい機能はあるけど、今でも十分に使えると思うので、ベータリリースをしておこうかと思う今日この頃。
カテゴリー: Seasar
Extractorのリファクタリング
Extractorをリファクタリングしてしまった。ほぼ、APIはフリーズで良いかと思っていたのだけど、Tikaを導入することで S2Robot がサポートするファイル形式がかなり増えることになるので実施した。docxなどの新MSOffice系からオーディオや画像まで対応できることになる。まぁ、オーディオや画像はメタデータになるのだけどね。という感じで S2Robot が扱えるファイル形式は ここ にあるやつ(現時点では 0.4)。来週中には残り2つのタスクを処理してリリースしよう。
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 で呼ばれて処理されるようだ。