SolrのDataImportHandlerが便利

既存アプリに全文検索を追加するのに(あるにはあるが、LIKE検索なので使い物にならない..)、当初SQL Serverのフルテキスト検索にしようかと考えていたのですが、できればオープンソースのソフトウェアの方がよいので、Luceneベースの全文検索システムであるSolrを試しています。

DataImportHandlerは、JDBC経由でRDBMSのデータをSolrに登録する機能です。登録するデータの抽出もSQLを使用できるので、どのテーブルのどのデータを登録するかなどかなり自由度が高いです。すでにDBにデータあるアプリケーションに全文検索を追加する場合に、DataImportHandlerを使えば既存のDBへのデータ登録処理への影響が少なくてすみます。

管理画面が充実しているのとDataImportHandlerのおかげで、技術検証レベルではほとんどプログラムを書かなくてすみました。以下は少しいじってみてた時のメモです。

CJKAnalyzerのバグを修正する

exampleをベースにいじってみて日本語で検索するとうまくヒットせずしばらく悩みました。日本語文章をN-gram方式でインデックスを作成するための、LuceneのCJKAnalyzerにはバグがあり、修正する必要があるそうです。
Solr CJKAnalyzerで日本語文章の検索をする その2 CJKAnalyzerのバグを修正する - Solr, Python, MacBook Air
http://issues.apache.org/jira/browse/LUCENE-973
上記のknaka20blueさんの記事のとおりですが、1年以上経過した現在でも同梱されるLucene2.4では修正されていないようですのでパッチを当てる必要があります(対応はLucene2.9となっているので、Solr1.4では修正されていると思います)。以下は私が、Windows XP, Solr1.3でパッチを当てた手順です。

Luceneのソースをダウンロード

Solr 1.3ではLucene 2.4が同梱されているようですので、Luceneのサイトから2.4.1のソースをダウンロードしました(lucene-2.4.1-src.zip)。

パッチを当てる

まず、Windows環境でpatchコマンドを使うために、以下の記事を参考にGNU patchをインストールしpathを通しておきます。
Windows で patch コマンドを利用する - make world

LUCENE-973に添付されている一番新しいパッチ(LUCENE-973.patch)をダウンロードして、Luceneのソースのzipを展開したフォルダで以下のコマンドを実行してパッチを当てます。

patch -p0 < LUCENE-973.patch

一箇所失敗している部分があるようでしたが、コメント行でしたのでとりあえず無視しました。Lucene本体、Analyzersの順にビルドします。

>ant
...
>cd contrib\analyzers
>ant
...

build\contrib\analyzersに修正されたlucene-analyzers-2.4.jarが作成されますので、これをSolrフォルダのlibにlucene-analyzers-2.4-dev.jarとしてコピーします。そしてSolrをビルドします。

ant dist

distフォルダにapache-solr-1.3.0.warが作成されます。このwarを使用して、管理画面のAnalysisでLUCENE-973にある修正後の結果と同じになっていればOkです。

Tomcat上で動作させる

apache-solr-1.3.0.warを使用する手順です。
SolrTomcat - Solr Wiki
のとおりですが、日本語で検索を行うためには、conf/server.xmlのconnectorにて、

URIEncoding="UTF-8"

を追加する必要があります。また、

useBodyEncodingForURI="true"

があるとクエリの日本語が正常に処理されません。