目次
久々にlucene-gosenの話です。 しかも、あんまり嬉しくない話しです。
すでにissueをアップしていますが、lucene-gosenとSynonymFilterを併用する場合に、特定の条件下でNullPointerExceptionが発生してしまいます。
条件は以下の組み合わせになります。
- Solr 3.5.0以前
- lucene-gosen1.2.0 - 1.2.1の辞書なしjar
- SynonymFilterFactoryにてtokenizerFactoryを指定
根本的にはSolr側の問題のようです。SOLR-2909としてissueが上がっています。
SynonymFilterFactoryでは、類義語の設定ファイルの単語を読み込むときにtokenizerFactoryを指定できます。 このとき、SynonymFilterFactory内部でtokenizerFactoryに指定されたFactoryのクラスが読み込まれ、 インスタンス化されて、Tokenizerが作成されます。 この、Tokenizerのインスタンス化の処理シーケンスに問題があります。 schema.xmlの<tokenizer>タグで指定されたTokenizerFactoryでは、ResourceLoaderAwareインタフェースのinform(ResourceLoader loader)メソッドが実行されます。 このinform()メソッドがSynonymFilterFactoryのToeknizerのインスタンス化の場合に実行されません。 lucene-gosenのJapaneseTokenizerFactoryではこのinform()メソッドでdictionaryDirのパスの読み込みを行なっています。(このへん)
上記の条件では、NullPointerExceptionが発生すると書きました。 辞書を内包したjarファイルを利用している場合、NullPointerExceptionが発生しなくても次のような問題点があります。こちらの問題は見た目は動いているように見えてしまうので注意が必要です。 すべて、SynonymFilterを利用する時点でも問題点になります。
- compositePOS設定が類義語辞書読み込み時に無効
- dictionaryDir設定が類義語辞書読み込み時に無効(=jarに内包されている辞書で動作する)
一見動いているように見えるかもしれませんが、望んでいてる動作になっていない可能性があるので注意が必要です。
解決策(まだ途中)
先程書きましたが、基本的にはSolr側の修正をするのが妥当です。 SolrのJIRAにパッチもアップされました。 こちらのパッチをSolrに適用し、SynonymFilterFactoryを次のように指定することで問題を回避することが可能になります。
<tokenizer class="solr.JapaneseTokenizerFactory" compositePOS="compositePOS.txt"
dictionaryDir="dictionary/naist-chasen"/>
...
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true"
expand="true" tokenizerFactory="solr.JapaneseTokenizerFactory"
**compositePOS="compositePOS.txt" dictionaryDir="dictionary/naist-chasen"**/>
...
SynonymFilterFactoryの設定にcompositePOS、dictionaryDirを追加します。 ここの設定は<tokenizer>タグで指定された設定と同じ物を指定します。以上で問題なく動作することになります。
ただし、この方法はSolrにパッチを当てなければいけません。 Solrにパッチを当てるのもなかなかな作業だと思います。 ということで、どうにかlucene-gosen側だけでも対応出来る形にしたいなぁと考えているところです。 残念ながら、まだ考えているだけですので、もう少し提供できるのは先になってしまいますが。。。 現時点では、次の方法を考え中です。
- informメソッドを呼ぶフラグを追加して、どうにかしてinformメソッドを呼び出す
- SynonymFilterの修正版をlucene-gosenに内包して提供する
できれば、a.にて対応できればと思っています。 最悪、b.の方法かと。 悩んでいる間にSolrの次のバージョンが出てしまわないように出来るだけ早く対応しようと思っています。 他にも問題点や気になる点があれば、日本語、英語を問わないので、気兼ねなくissueに上げてもらうか、Twitterで私宛にメンションしてもらえればと。 (あ、issue23へのパッチでもいいですよ!)
追記: まだ、SOLR-2909のパッチを適用してからの確認はできていません。(ソース見て大丈夫だと思ってるレベル) あと、現時点での対応方法としては、「lucene-gosenとは別のjarにSynonymFilterFactoryなどを入れて提供」が妥当かなぁと考えているところです。(無理やりinformメソッド呼び出すのは骨が折れそう+パッチが思いの外早く出て、導入されたのでlucene-gosen本体に特殊処理を入れるのはあまりメリットを感じない。)
comments powered by Disqus
See Also by Hugo
- 辞書の外部化とLucene/Solr3.4対応(Jugemより移植)
- 辞書のjarファイルからの分離(Jugemより移植)
- lucene-gosenのUniDic対応(Jugemより移植)
- 複数辞書の読み込み機能追加(仮)(Jugemより移植)
- Apache LuceneのKuromojiのUniDicビルド対応パッチについて