目次
先日、辞書のjarファイルからの分離についてパッチと記事を書きました。
IssueにあげていたパッチをRobertさんが見ていたらしく、次のようなコメントをもらいました。
Maybe if we change SenFactory.getInstance to use a ConcurrentHashMap then you can easily use multiple dictionaries at the same time?
「SenFactory.getInstanceメソッドでConcurrentHashMap使ったら複数辞書対応できるんじゃない?」(訳) たしかに。。。なんで思いつかなかったのだろう。。。
ということで、実装してみました。 パッチはこちら。
使い方ですが、先日の記事と代わりはありません。 ただし、あった制限事項が次のようになります。
- マルチコアの設定でsharedLibにlucene-gosenのjarを含まない
同一コア内で異なるdictinaryDirの指定はできない
ソースの変更点ですが、ものすごく単純です。 dictionaryDirに指定された文字列をキー、その辞書ディレクトリを利用したSenFactoryのインスタンスを値に持つmapをSenFactory内に保持します。あとは、SenFactoryのgetInstance(String dictionaryDir)メソッドで取得する際にmapに対応するインスタンスがあれば、そのインスタンスをなければ、dictionaryDirから辞書を読み込んでインスタンス生成してmapにキャッシュしつつ返すという実装に変えただけです。 ということで、次のようなIPADICとNAIST-JDIC for ChaSenを同時に使う設定も可能となります。
<fieldType name="text_ja_ipadic" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.JapaneseTokenizerFactory" dictionaryDir="/tmp/lucene-gosen/dictionary/ipadic"/>
</analyzer>
</fieldType>
<fieldType name="text_ja_naist_chasen" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.JapaneseTokenizerFactory" dictionaryDir="/tmp/lucene-gosen/dictionary/naist-chasen"/>
</analyzer>
</fieldType>
あと、注意事項です。 普通に考えるとわかることですが、辞書を複数読み込めるようになったことで、読み込んだ複数の辞書をメモリに保持することになります。ですので、今までよりも多くのメモリを利用するので、Heapのサイズには注意が必要です。 例のごとく(ほんとよくない。。。)テストコードを書いていない状態のパッチをまずはアップしました。 テスト書かないと。。。次回はテストコードかきましたと言う報告をしたいな
あと、Robertさんのコメントの前に@shinobu_aokiさんからJapaneseTokenizerFactoryの設定では辞書のディレクトリを$SOLR_HOME/confからの相対パスで記述できるというパッチもいただいています。 この部分については先日と使い方が異なります。 (すみません、まだきちんとソースを見れてないです。。。)
comments powered by Disqus
See Also by Hugo
- lucene-gosenとSynonymFilterを利用するときの注意点(問題点編)(Jugemより移植)
- lucene-gosenのUniDic対応(Jugemより移植)
- 辞書のjarファイルからの分離(Jugemより移植)
- lucene-gosenとは(Jugemより移植)
- Apache LuceneのKuromojiのUniDicビルド対応パッチについて