Solr9:Kuromoji+NEologdをビルドする
結論から言うとKuromoji+Unidicをビルドするよりも簡単でした。もっと言うとSolr8以前でKuromoji+NEologdをビルドするよりも簡単です。kuromoji.gradleをNEologd用の内容にするだけで、ソースへのパッチ当てがいらないからです。簡単だから「solr9 neologd」で検索しても情報がないのかな?とまれ、大まかな手順は以下の3つです。
- mecab-ipadic-neologdをインストールする
- NEologdの中間生成物をluceneのビルド用ディレクトリに設置する
- NEologd用にカスタムしたkuromoji.gradleでKuromojiのビルドを行う
以下に辞書編集やパッケージ名の変更を行うことも考慮した詳細手順を記していきます。
環境
-
AlmaLinux 9.2
-
OpenJDK 11
-
Solr 9.2.1 ※ビルドするだけであればSolrは必要ありません
-
Lucene 9.4.2
mecab-ipadic-neologdのインストール
mecab、mecab-ipadic-neologdをインストールして、中間生成物の辞書ファイルを得ます
mecabのインストール
sudo yum install -y bzip2 bzip2-devel gcc gcc-c++ git make wget curl openssl-devel readline-devel zlib-devel patch
cd [好きなディレクトリ]
mkdir mecab
cd mecab
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE' -O mecab-0.996.tar.gz
tar zxvf mecab-0.996.tar.gz && cd mecab-0.996 && ./configure --with-charset=utf8 --enable-utf8-only && make && sudo make install
mecab-ipadic-neologdのインストール
cd [好きなディレクトリ]
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n --max_baseform_length 15
形態素解析エンジンを弄ってみる こちらに書かれているように、Kuromojiでのビルドを可能にするため、「--max_baseform_length 15」オプションが必須です。
インストール後にできた build/mecab-ipadic-2.7.0-20070801-neologd-20200910 以下のファイルをLuceneでkuromojiをビルドするときに使います。
ちなみに、このディレクトリにmatrix.defがありますが、LuceneのDictionaryBuilder.java を見ると、このmatrix.defを読み込んで処理していることがわかります。
[オプション] 辞書ファイルの編集
NEologdの内蔵辞書ファイルを編集したい場合、build/mecab-ipadic-2.7.0-20070801-neologd-20200910/mecab-user-dict-seed.20200910.csv を編集します。
LuceneでKuromoji+NEologdのビルド
Kuromojiを使用したいSolrのLuceneと同じバージョンのLuceneのソースをシャロークローンします。
cd [好きなディレクトリ]
git clone https://github.com/apache/lucene.git --branch releases/lucene/9.4.2 --depth 1
上述したmecab-ipadic-neologdの中間生成物をlucene/analysis/kuromoji/build/generate 以下にコピーします。
cd lucene
mkdir -p lucene/analysis/kuromoji/build/generate
cp -r [mecab-ipadic-neologdのソースをcloneしたディレクトリ]/mecab-ipadic-neologd/build/mecab-ipadic-2.7.0-20070801-neologd-20200910 lucene/analysis/kuromoji/build/generate
Kuromoji+NEologdをビルドするためのgradleファイルを設置します
cd gradle/generation
mv kuromoji.gradle kuromoji.gradle.org
curl -O https://gist.githubusercontent.com/KANATAKA/6f8b747a335ac1244e95ae59b37d227d/raw/716635983d3aa8744bee28b53b766bdabadcfd94/neologd.kuromoji.gradle
mv neologd.kuromoji.gradle kuromoji.gradle
kuromoji.gradleの中身を確認して、dictionaryNameがmecab-ipadic-neologdの中間生成物ディレクトリ名(この例ではmecab-ipadic-2.7.0-20070801-neologd-20200910)と等しいことを確認してください。異なる場合は中間生成物ディレクトリ名に書き換えます。
[オプション]パッケージ名の変更
Kuromoji+NEologdをデフォルトのKuromoji+IPADicやKuromoji+Unidicと同時に使用したい場合はパッケージ名のドメイン部分を変更してパッケージが相互に被らないようにします。
# Luceneをクローンした直下のディレクトリに移動
cd -
curl -O https://gist.githubusercontent.com/KANATAKA/a138080f4e4a5b983d859ca91e91f73a/raw/1fc6fbcfc5fd490c522ef6d95ffe52ad86696654/mod_package.sh
# この例ではドメイン名をcom.exampleに変更しています
sh mod_package.sh com.example
あとはgradlewを実行するだけです。kuromoji.gradleを差し替えただけで、Luceneのソースはそのままです。
cd [Luceneをクローンした直下のディレクトリ]
./gradlew assemble compileNEologd
# 非推奨APIを使っているワーニングがたくさん出ますが大丈夫です
./gradlew assemble
成功すると、lucene/analysis/kuromoji/build/libs/ 以下に lucene-analysis-kuromoji-9.4.2-SNAPSHOT.jar ができています。
パッケージ名を確認してみます。
jar tf lucene/analysis/kuromoji/build/libs/lucene-analysis-kuromoji-9.4.2-SNAPSHOT.jar | less
: 略
com/
com/example/
com/example/lucene/
com/example/lucene/analysis/
com/example/lucene/analysis/ja/
com/example/lucene/analysis/ja/GraphvizFormatter.class
com/example/lucene/analysis/ja/JapaneseAnalyzer$DefaultSetHolder.class
com/example/lucene/analysis/ja/JapaneseAnalyzer.class
com/example/lucene/analysis/ja/JapaneseBaseFormFilter.class
com/example/lucene/analysis/ja/JapaneseBaseFormFilterFactory.class
: 略
もし、以下のようなメッセージが出てビルドに失敗するときはビルドする環境のメモリが足りているかどうか確認してください。
Execution failed for task ':lucene:analysis:kuromoji:compileNEologd'.
> Process 'command '/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-4.el9.alma.x86_64/bin/java'' finished with non-zero exit value 137
Solrへの設置
lucene-analysis-kuromoji-9.4.2-SNAPSHOT.jar を lucene-analysis-kuromoji-9.4.2-neologd.jar などに改名し、Solrの server/solr-webapp/webapp/WEB-INF/lib に設置します。
使用する際は、スキーマのフィールドタイプでtokenizerのclassを"com.example.lucene.analysis.ja.JapaneseTokenizerFactory"などとビルド時に使用したパッケージ名で指定します。
Discussion