Apache Solr 8用のNEologdを組み込んだkuromojiをビルドしようとしたところ、Apache Solr側の新元号対応が原因でハマった件。

By | 2019年6月8日 , Last update: 2020年8月31日

はじめに

前の記事Apache Solr 7用のNEologdを組み込んだkuromojiをビルドした件について書きました。

Apache Solrは全文検索システムというソフトウェアシステムの中ではかなり基幹システム寄りの位置に鎮座しているものですので、あまりアップデートが行われないものかと思いきや、気が付くと次のメジャーリリースバージョン(Apache Solr 8)が登場していました。

Apache Solr 8についても7の場合と同様にNEologdを組み込んだkuromojiがビルドできるかどうか試してみたところ、この記事のタイトルにもある通り、Apache Solr 8の新元号対応パッチが原因でkuromojiのビルドができませんでした。そこで、修正を行ったパッチを作成し、それを適用することでkuromojiのビルドができるようになりました。

この記事ではkuromojiのビルドの方法及びビルドの際の対応策について書きます。

スポンサーリンク

kuromojiがビルドできるまで。

基本的にはこの記事と同じ手順で作業を進めていきます。なお、この記事ではSolr8対応のkuromojiで、かつNEologdを組み込んだものを「kuromoji-NEologd」と書きます。

kuromoji-NEologdの作成に用いた環境等

kuromoji-NEologdの作成に用いた環境等は以下の通りです。なお、作成には本WebサイトではおなじみのいつものNUCを使用しています。

次節以降の記述では、Apache Solr 8.1.1のソースコードを使用した際のバージョンを記述していますので、適宜読み替えて見ていただけると幸いです。

Apache Solr 8.1.1のソースコードを使用した際の環境等

  • OS(というかディストリビューション): Fedora 30
  • Java: OpenJDK-1.8.0-212
  • Apache Solrのバージョン: 8.1.1
  • NEologdの更新日: 20190530

Apache Solr 8.5.2のソースコードを使用した際の環境等

  • OS(というかディストリビューション): Fedora 32
  • Java: OpenJDK-1.8.0-252
  • Apache Solrのバージョン: 8.5.2
  • NEologdの更新日: 20200521

ビルドの手順

kuromoji-NEologdは以下の手順でビルドします。

  1. MeCabまたはApache Antがインストールされていない場合には、dnfコマンドを使用してインストールします。具体的なインストールの方法はこちらをご参照ください。
  2. Apache Solrのダウンロードのページからソースコード(この記事を最初に書いている時点(2019年6月)の最新版は8.1.1です。以下、8.1.1をダウンロードしたものとして記述します。)をダウンロードします。”solr-8.1.1-src.tgz”という名前のファイルをFedora 30が稼働しているPC(以下、単に「Fedora PC」と書きます。)にダウンロードします。
  3. Fedora PC上で以下のコマンドを実行し、手順3でダウンロードしたソースコードを展開します。
    $ tar zxvf solr-8.1.1-src.tgz

     
    すると、solr-8.1.1という名前のディレクトリが作成されて、その下にソースコードが展開されます。

  4. NEologd組み込み用パッチを適用します… と言いたいところですが、前の記事で使ったパッチがうまく適用できませんでした(詳細については後述。)ので、パッチを作り直した上で以下のコマンドを実行し、ソースコードにパッチを適用します。なお、作り直したパッチはGitHubに置きました。
    $ cd solr-8.1.1
    $ patch -p1 < solr-8.1.1-kuromoji-neologd.patch

     

  5. パッチの適用に成功したら、NEologdのGitHubでNEologdの最新の更新日を確認します。NEologdのトップページ(下図)の赤矢印のあたりに書いてあることが多いようです。
  6. 手順6で確認した更新日を年4桁、月2桁(左ゼロ詰め)、日2桁(左ゼロ詰め)の8桁で表した文字列をlucene/build.propertiesのneologd.propertiesに指定します。指定例を以下に示します。
    neologd.version=20190530

     

  7. solr-8.1.1の直下のディレクトリで以下のコマンドを実行します。ant clone-neologdの実行時にNEologdの本体がGitHubのリポジトリからcloneされます。ちょっと時間がかかるかもしれませんが、辛抱強く待ちます。
    $ ant ivy-bootstrap
    $ ant compile
    $ cd lucene/analysis/kuromoji
    $ ant clone-neologd
    $ ant build-dict
    $ ant jar-core

     

  8. lucene/build/analysis/kuromojiの下に以下のような名前のjarファイルが作成されます。
    lucene-analyzers-kuromoji-ipadic-neologd-<lucene version>-SNAPSHOT-<creation date of neologd>.jar

     

パッチの適用に失敗した原因と対応策


スポンサーリンク

この記事におけるビルド時に使用したパッチの適用に失敗した直接の原因は、lucene/analysis/kuromoji/build.xmlで定義されているビルドのターゲットのうち、”build-dict”ターゲットのdepends属性の定義が衝突していた(パッチ側では想定されていなかった”patch-dict”ターゲットがdependencyとして設定されていた。)のが原因でした。

そこで、”patch-dict”ターゲットを見てみたところ…

<target name=”patch-dict” depends=”download-dict”>
<patch patchfile=”src/tools/patches/Noun.proper.csv.patch”
originalfile=”${dict.src.dir}/Noun.proper.csv”/>
</target>

 
となっていました。Noun.proper.csvにパッチを当てる処理を実行するようです。

それで、このNoun.proper.csv.patchは一体何者なのかといいますと…

なんと、「新元号対応パッチ」でした。🤔

パッチの適用対象となっているNoun.proper.csvは固有名詞が記述されているファイルですが、NEologdによって修正が行われる可能性がありそうなことと、パッチ適用後の”build-dict”ターゲットのdepends属性に追加される”build-dict-neologd”ターゲット中で実行されるmake-mecab-ipadic-neologd.shというシェルスクリプト中でNoun.proper.csvに対する(別の)パッチ(*1)の適用等の変更が行われていることから、以下のように処理の方法を変更することとしました。

  1. “patch-file”ターゲットは実行しない。
  2. Noun.proper.csv.patchの最後の行を上記(*1)が適用後のNoun.proper.csvに追加するための処理をmake-mecab-ipadic-neologd.shに挿入するためのパッチ(*2)を作成する。
  3. 上記パッチ(*2)を適用する処理を”build-dict-neologd”ターゲットでmake-mecab-ipadic-neologd.shを起動する直前に挿入する。

まとめ

kuromojiのビルドに成功すると、次はインストール及び動作確認という作業の流れになります。

動作確認のためのApache Solrの必要最低限の設定の方法についてはあまりこれといった定番の方法がないようですので、この記事とは異なる視点を織り込みつつ、別の記事で書きましたので、ご覧いただけると幸いです。

この記事は以上です。