5.0.0のKuromojiに、mecab-ipadic-neologdの辞書を組み込むと実行時にエラーになる話Lucene追記)LuceneにIssueとパッチを出してみましたが、取り込まれたようです。次のバージョンで解消されるでしょう。ここ最近、LuceneのKuromojiにmecab-ipadic-neologdの辞書を組み込んでみているのですが、3/19を境にneologdの辞書を組み込むとエラーになるようになりました。辞書を使ったビルドはできるのですが、実際に使おうとするとこのようなエラーを見ることになります。org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:179)〜省略〜問題になっているのは、このあたり。https://github.com/apache/lucene-solr/blob/lucene_solr_5_0_0/lucene/core/src/java/org/apache/lucene/util/fst/FST.java#L387https://github.com/apache/lucene-solr/blob/lucene_solr_5_0_0/lucene/core/src/java/org/apache/lucene/util/fst/BytesStore.java#L71https://github.com/apache/lucene-solr/blob/lucene_solr_5_0_0/lucene/core/src/java/org/apache/lucene/store/InputStreamDataInput.java#L47@moco_betaさんもこちらを見てくださったのですが、まさにこの通りです。具体的に書くと、「読みとるべき辞書データのトータルバイト数」を辞書ファイルの冒頭に書いておき、実行時はそれを信用して辞書のロードを行うのですが、ファイルに書いてあるサイズと実際に読み取れるサイズがずれた状態になっているようです。1<<maxBlockBits);https://github.com/apache/lucene-solr/blob/lucene_solr_5_0_0/lucene/core/src/java/org/apache/lucene/util/fst/FST.java#L386この期待するバイト数、もしくはブロック長サイズとずれた状態を検出すると、EOFExceptionが飛びます。}https://github.com/apache/lucene-solr/blob/lucene_solr_5_0_0/lucene/core/src/java/org/apache/lucene/store/InputStreamDataInput.java#L47とまあ、そこまではわかるのですが、なんでこういうことになったのか?という話ですね。5.0.0で読ませると動くという...。5.0.0で使っていて、それで動いていた」ということを考えると、辞書の更新によりLuceneの何らかの潜在的な問題を踏んだと考えるのが自然だと思います。※@overlastさん、neologd側も確認していただいてありがとうございましたで、ちょっとデバッグしてみたのですが、FSTに書き込んだトータルバイト数がきちんと読み出せていることは確認できました。なると、ホントに後続する書き出しの部分が怪しいです。Kuromojiの辞書構築部分で、FSTの書き出し指示をしているのはここになります。}https://github.com/apache/lucene-solr/blob/lucene_solr_5_0_0/lucene/analysis/kuromoji/src/tools/java/org/apache/lucene/analysis/ja/util/TokenInfoDictionaryWriter.java#L48このFST#saveの実装はこうなっています。}https://github.com/apache/lucene-solr/blob/lucene_solr_5_0_0/lucene/core/src/java/org/apache/lucene/util/fst/FST.java#L606あれ...?ここで、4.10.4のFST#saveの実装を見てみましょう。5からはNIO.2を使うように変更されたんでしたね。5.0.0のFST#save、BufferedOutputStreamの扱いが...。いうわけで、こう修正してみました。}だって、BufferedOutputStreamをクローズしてないじゃないですか...。4.10.4ではクローズしてますからね。jar-core」を実行してできあがったJARファイルを使うと、問題は解消されました。いうわけで、たぶんLuceneのバグだと思います。3/19のneologd側の辞書更新で、たまたまバッファリングされていたデータが書き出されない状態になって発現したのだと。@overlastさんには、ご迷惑をおかけしました...スミマセン...。Kuromojiのトークナイズを、Graphvizを使ってビジュアル化するちょっと前に見ていたこちらのエントリ。Kuromojiに適用して...先日、このようなエントリを書きました。5はてなブログをはじめよう!Kazuhiraさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。