事情があって、各種ファイルからテキストから抜き出して、Solrに入れるという作業をすることになりました。
Solrにもファイルを渡して、解析をしてくれるI/Fがありますがタイミングをプログラムでコントロールしたかったので、Solrにやらせず文書登録機能からSolrをアップデートさせる方向で考えました。
どうせなら同じライブラリを使おうと思い、Apache LuceneのサブプロジェクトのApache Tikaを使うことにしたのですが、情報が少ないのでテストプログラムを書いてみました。
pom.xmlでの依存関係
pom.xml
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.5</version>
</dependency>
Parseする場合にByteArrayInputStreamの形に変換する必要があるので、手っ取り早くやるために、Commons-IOを使うために以下も追加しました。
pom.xml
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
例外処理を除いたコード片
実際にパースするだけであれば、簡単で、以下のコードで取得できます。分割しているのでJUnitコードをほとんど載せます。ファイルパスをタイプごとに管理しているMapの詳細は割愛します。
TikaTest.java
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.WriteOutContentHandler;
import org.junit.Test;
import org.xml.sax.SAXException;
public class TIkaTest {
@Test
public void test() throws IOException, SAXException, TikaException {
Parser parser = new AutoDetectParser();
Metadata metadata = new Metadata();
StringWriter writer = new StringWriter();
ByteArrayInputStream bytes = getTestData("doc");
parser.parse(bytes,
new WriteOutContentHandler(writer),
metadata,
new ParseContext());
//このcontentが目的の文字列。Solrの形態素解析をおこなうフィールドに格納して、解析させる。
String content = writer.toString();
}
private ByteArrayInputStream getTestData(String type) throws IOException{
//ファイル種別をキーとして、テスト用のファイルパスを値とするMapからパスを取り出して、読み込む。
return read(TYPES.get(type));
}
private ByteArrayInputStream read(String path) throws IOException{
File file = new File(path);
return new ByteArrayInputStream(FileUtils.readFileToByteArray(file));
}