ファイルをtikaで解析してSolrのインデックスに入れるDataImportHandlerの設定

Solr 3.1からTikaEntityProcessorというDataImportHandler用のProcessorがついたけど、これをDataSourceや他のProcessorとどう組み合わせて良いかがさっぱりわからない。

ぐぐりつつ試してみて、あるディレクトリ以下のファイルを全て取り込むのは多分これで良いという結論になった。

data-config.xml

<dataConfig>
    <dataSource type="BinFileDataSource" name="bin"/>
    <document>
        <entity name="file" processor="FileListEntityProcessor"
                baseDir="/path/to/targetdir"
                fileName=".*"
                recursive="true"
                rootEntity="false"
                dataSource="null">
              <entity name="tika" processor="TikaEntityProcessor"
                      dataSource="bin"
                      url="${file.fileAbsolutePath}"
                      format="text"
                      transformer="LogTransformer"
                      logTemplate="file: ${file.fileAbsolutePath} processed"
                      logLevel="info"
                      onError="skip"
              >
                   <field name="Author" meta="true" column="author"/>
                   <field name="title" meta="true"  column="title"/>
                   <field name="text"               column="text" />
              </entity>
        </entity>
    </document>
</dataConfig>

TikaEntityProcessorはDataSourceのサブクラスがdataSourceになってないといけない。なのでBinFileDataSourceが必要。で、BinFileDataSourceはファイルの絶対パスが必要なのでFileListEntityProcessorからもらう。

FileListEntityProcessorはあるディレクトリの下にあるファイルを一つ一つ処理する感じ。正規表現でファイルをexcludeすることもできる。

  1. FileListEntityProcessorでファイルパスのリストを作る
  2. 一つずつTikaEntityProcessorで処理する
    1. FileListEntityProcessorで作ったファイルのパスを受け取る
    2. BinFileDataSourceにパスを渡す
    3. InputStreamになったデータを処理してスキーマに合わせて突っ込む

このFileListEntityProcessorとの組み合わせがあんまり情報ないんですよ。。。

対応するschema.xml(の一部)

 <fields>
   <field name="title" type="string" indexed="true" stored="true"/>
   <field name="author" type="string" indexed="true" stored="true" />
   <field name="text" type="text" indexed="true" stored="true" />
   
 </fields>

スキーマはこんな感じ。多分他にも増やせばTikaが抽出できるメタデータをもっと入れられるんだと思うけど、そこまで調べられていない。


やってみると、Tikaで処理できない旨のエラーが結構おきる。処理できなかったときには、特別なログに吐くなどしてエンドユーザに知らせたいんだけど、今のところSolrが普通通りログに吐くことしかできない。onErrorで好きな処理を指定することができなくて、abortするかそのドキュメントをskipするかしかできない。