Solrのコアに写真の撮影日をTika経由で登録する

Apache Solrのコアに、Exifで記録された撮影日をTika経由で登録してみました。Solrのバージョンは、4.9.0です。

solrconfig.xml

uprefixの「ignored_」が、ここで設定しなかった撮影情報の接頭語になります。

<requestHandler name="/update/extract"
                startup="lazy"
                class="solr.extraction.ExtractingRequestHandler" >
  <lst name="defaults">
    <str name="lowernames">true</str>
    <str name="uprefix">ignored_</str>
    <str name="captureAttr">true</str>
    <str name="fmap.date_time_original">date_time_original</str>
  </lst>
  <lst name="date.formats">
    <str>yyyy:MM:dd HH:mm:ss</str>
  </lst>
</requestHandler>

最後の「date.formats」は、Tikaが撮影情報を読み取ると「2014:07:16 21:19:47」という形式でSolrに返します。しかし、この日時形式は標準ではサポートされていない為、日時の書式を追加しました。追加しなかった場合、写真をPOSTすると以下のエラーがSolrから返ってきます。

<lst name="responseHeader">
  <int name="status">400</int>
  <int name="QTime">1455</int>
</lst>
<lst name="error">
  <str name="msg">Invalid Date String:'2014:07:16 21:19:47'</str>
  <int name="code">400</int>
</lst>

schema.xml

コアのスキーマに、撮影日(DateTimeOriginal)のフィールドを追加しました。ダイナミックフィールドの「ignored_*」は、スキーマに定義されていない撮影情報に関する設定です。

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="date_time_original" type="tdate" indexed="true" stored="true"/>
<dynamicField name="ignored_*" type="string" indexed="false" stored="false" multiValued="true"/>
<uniqueKey>id</uniqueKey>

写真のアップロード

curlコマンドで写真をアップロードしてテストしました。

$ curl 'http://127.0.0.1:8983/solr/exif/update/extract?literal.id=1&commit=true' -F "myFile=@DSCN0005.jpg"
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">1297</int></lst>
</response>

結果

Solrの管理画面で、撮影日がdate_time_originalフィールドに追加されているのを確認しました。


余談

日付型のフィールドに撮影日を登録する方法で悩んだので記事にしました。日付型にしたかったのは、撮影日でファセット検索したかったからです。