Solrの日付型

Fessではファイルの更新日時とかlongとしてもっていたのだけど、日付のファセットをやろうと思うとdate型にする必要があるようなので、型を変更することにした。そもそも、なんでlongにしていたかというと、いまいちSolrJ経由でdate型としての突っ込み方を調べていなかったからです…。(まぁ、簡単に言うと手抜きです…ごめんなさい) というわけで、今回、Solrでdate型を利用することにしたのだけど、Solrのschema.xml的には

<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>

というような型の定義があると思うけど、これを

<field name="tstamp" type="tdate" stored="true" indexed="true"/>

という感じで利用する。記述フォーマットについてはSolrのorg.apache.solr.schema.DateFieldのJavaDocとか見れば良いと思うけど、ISO 8601に従う感じで、XML Schema にある、より厳しくした感じの正規化した日付表現で以下のような感じ。

  • 1995-12-31T23:59:59Z
  • 1995-12-31T23:59:59.9Z
  • 1995-12-31T23:59:59.99Z
  • 1995-12-31T23:59:59.999Z

Javaのコードで上記の文字とDateへの変換はorg.apache.solr.common.util.DateUtilを使えば良さそう。パースの方はDateUtil.parseDate(String)で良いと思うけど、日付から文字列へはDateUtil.getThreadLocalDateFormat().format(date)という感じでやればよさそう。FessではFessFunctionsで実装して、JSP上からも${fe:〜}で利用している。

HttpClient4でPreemptive Auth

FessではSolrのコンテキストに対してBASIC認証をかけているのだけど、Solr4ではSolrJがHttpClient4がデフォルトになり、HttpClient3のときのようにフラグだけでPreemptive Authの設定できない感じだ。SolrJ自体がそれに対応していれば良いのだけど、そうではないっぽい。まぁ、SolrJはHttpClient4を利用しているのでHttpRequestInterceptorでBASIC認証の情報をaddHeaderしてあげれば良いみたい。SolrLibのところにコードはおいてあります。別にSolrJじゃなくても使える気はするけど。

codelibsのsolrlib

Fessに入っていたSolrサーバーにアクセスするためのコードを抜き出して、solrlibとしてまとめました。FessではアクセスするSolrサーバーたちを複数まとめて扱えるようにしたり、リトライできるようにしたり、生死監視したりとかしているのだけど、その辺の機能です。まぁ、Fessから抜き出すことでFessと同じようなことがFess以外のJavaプロジェクトでしやすくなるかと思います。まぁ、solrjのSolrServerのインスタンスをラップしている感じですが、Solrを真面目に使うなら必要そうな機能な気はします。そんな感じで、codelibsで作っていきます。