SolrJ 4.2の変更点

Solr 4.2になって、SolrJのSolrQuery#addSortFieldがDeprecatedになった。つまり、

query.addSortField("hoge", ORDER.desc);

というのを

query.addSort("hoge", ORDER.desc);



query.addSort(new SortClause("hoge", ORDER.desc));

という感じに変更するみたい。この変更は順番の関係かしら…。

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:〜}で利用している。

Archiva 1.4 M3のインストール

ArchivaはApacheから提供されているMavenなどのリポジトリ管理ツールである。Mavenなどをよく使うと成果物の置き場とかには悩むかと思うがそれを管理することができる。というわけで、説明はここにあるけど、1.4 M3を既存のTomcat 7などに入れる方法を書いておく。
まず、Archivaをここからダウンロードする。ダウンロードしたら

$ cd $TOMCAT_HOME
$ mkdir archiva
$ cp ~/Downloads/apache-archiva-js-1.4-M3.war archiva

という感じでディレクトリを作っておいておく。そんでさらに、derby-10.9.1.0.jar、activation-1.1.1.jar、mail-1.4.6-rc1.jarをMavenリポジトリなどから入手してlibに置く。

$ cp ~/Downloads/derby-10.9.1.0.jar ~/Downloads/activation-1.1.1.jar ~/Downloads/mail-1.4.6-rc1.jar lib

次にarchiva.xmlを生成する。

$ vi conf/Catalina/localhost/archiva.xml

内容は以下のような感じ。

<Context path="/archiva"
            docBase="${catalina.home}/archiva/apache-archiva-js-1.4-M3.war">
  <Resource name="jdbc/users" auth="Container" type="javax.sql.DataSource"
    username="sa" password="" driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
    url="jdbc:derby:${catalina.home}/archiva/database/users;create=true" />
  <Resource name="jdbc/archiva" auth="Container" type="javax.sql.DataSource"
    username="sa" password="" driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
    url="jdbc:derby:${catalina.home}/archiva/database/archiva;create=true" />
  <Resource name="mail/Session" auth="Container"
    type="javax.mail.Session" mail.smtp.host="localhost"/>
</Context>

そして、setenv.shに追記しておく。

$ vi bin/setenv.sh
export CATALINA_OPTS="$CATALINA_OPTS -Dappserver.home=$CATALINA_HOME -Dappserver.base=$CATALINA_HOME"

という感じであとはTomcatを起動すれば良い。

MavenでのServlet 3.0の依存関係

FessではTomcat 7の環境を利用しているのだけど、依存関係をいじったら

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletOutputStream

という感じで怒られるようになった…。たぶん、今まで微妙な依存関係でうまくいっていたのかもしれないけど、その辺を変更してしまったため、この問題が起きるようになってしまったのだと思う。ここにも依存関係の話題があるのだけど、今まではServlet API 3.0用に以下の感じで依存関係を記述していた。

javax
javaee-web-api
6.0
provided

これだとうまく行かないようなので、

javax.servlet
javax.servlet-api
3.0.1
provided

と書くことで良いみたい。というわけで、しばらくこれで様子を見てみよう。

HttpClient4でPreemptive Auth

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