Solr-1.4.1でcmecab-javaを使ってみる

久しぶりにjava関連の内容。

前提条件

今回の作業を行った環境は以下のとおり。

OSバージョン    : MacOSX 10.6.4 Snow Leopard
パッケージツール: MacPorts 1.9.1

Java

今回利用するバージョンは 1.6.0_20

javaはOSにインストールされているものをそのまま利用する。但し、一点だけ注意が必要。id:from_kyushu:20090713 に記載のある通り、JDK6を利用すると標準出力の際の文字コードSJISになってしまう。
今回、MeCabで利用する辞書はUTF-8を前提としているほか、MacOSのTerminal.appは文字コードが標準でUTF-8に設定されていることもあり何かと不都合があるので、以下のように設定を行う。

alias javac='javac -encoding UTF-8'
alias java='java -Dfile.encoding=UTF-8'

Solr

http://lucene.apache.org/solr/

何かと話題に登ることも多いオープンソース検索エンジンApache Solrも2010年6月下旬にバージョン1.4.1がリリースされているので、こちらを利用する。ダウンロードミラーサイトからアーカイブファイル(zipまたはtgz)をダウンロードし、適当な作業ディレクトリでアーカイブを展開する。

展開してできたディレクトリの中にexampleというディレクトリがあるので、今回はそれをそのまま使うことにする。exampleディレクトリに移動して、Solrを起動してみよう。

$ cd apache-solr-1.4.1/example
$ java -jar start.jar

ログが止まったところで起動完了なので、ブラウザでadmin画面を確認する。

http://localhost:8983/solr/admin/

MeCab

MeCab http://http://mecab.sourceforge.net/

MeCab(めかぶ)はオープンソースの日本語形態素解析エンジン。同じ日本語形態素解析器としては KAKASI, JUMAN, ChaSen などがあるがそれらと比べて高速に動作するとのこと。


インストールについてはMacPortsを利用する。コマンドは以下のとおり。

$ sudo port install mecab
$ sudo port install mecab-ipadic-utf8

インストールが完了したら、一箇所だけ手書きで修正

$ sudo vi /opt/local/etc/mecabrc
dicdir =  /opt/local/lib/mecab/dic/ipadic
            ↓
dicdir =  /opt/local/lib/mecab/dic/ipadic-utf8

cmecab-java

cmecab-java http://code.google.com/p/cmecab-java/

今回の主役。
インストール方法については↑のサイト(GoogleCode)のwikiに日本語で記載があるので、それを参考にしながらやる。

事前準備

wikiに記載されているネイティブライブラリも含めたすべての構築を行うので、以下のツール類もインストールしておく。

$ sudo port install apache-ant
$ sudo port install scons
$ sudo port install protobuf-java
ダウンロード&展開
$ cd workspace
$ curl -O http://cmecab-java.googlecode.com/files/cmecab-1.7.tar.gz
$ tar zxf cmecab-1.7.tar.gz
Javaライブラリの構築

展開したディレクトリに移動して、antでビルド。

cmecab-1.7/binディレクトリにcmecab-1.7.jarが生成されている。
これをapache-solr-1.4.1/example配下にコピー。

$ mkdir ../apache-solr-1.4.1/example/solr/lib
$ cp ../cmecab-1.7/bin/cmecab-1.7.jar ../apache-solr-1.4.1/example/solr/lib/.


このほかに、今回はLocalProtobufTaggerなども利用する前提なので、cmecab-1.7/lib配下のjarもsolrのプラグインディレクトリにコピーする。

$ cp ../cmecab-1.7/lib/*.jar ../apache-solr-1.4.1/example/solr/lib/.
ネイティブライブラリの構築

展開したディレクトリ配下、jniディレクトリに移動して、まずは設定変更。

SConstruct - 34行目付近から

@@ -34,11 +34,12 @@
 		incpath = [join(javahome, 'include'),
 			   join(javahome, 'include', 'solaris')]
 	else:
-		javahome = '/usr/lib/jvm/java-6-sun'
+		javahome = '/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home'
 		incpath = [join(javahome, 'include'),
-			   join(javahome, 'include', 'linux')]
+			   join(javahome, 'include', 'linux'),
+               r'/opt/local/include']
 
-	libpath = ['/usr/lib', '/usr/local/lib']
+	libpath = ['/opt/local/lib', '/usr/lib', '/usr/local/lib']
 	libs = ['mecab', 'protobuf']
 
 	ccflags = (['-Wall', '-g', '-O2'] +

編集ができたら、さっそくビルド。

すると、jniディレクトリに以下のライブラリが生成されている。

libCMeCab.dylib
libCMeCab_protobuf.dylib

あとはこれを java.library.path で指定されたパス配下にコピー。

$ sudo cp libCMeCab* /Library/Java/Extensions/.


ここまで出来たらあとは http://code.google.com/p/cmecab-java/wiki/HowToUse に書かれている通りにschema.xmlに定義を追加して、solrを起動し直せばOK*1

*1:もしExceptionが出てしまう場合は、ネイティブライブラリの配置場所がjava.library.pathに含まれていないとか、そのあたりが原因のハズなので調べながら適宜修正を。