複数辞書の読み込み機能追加(仮)(Jugemより移植)

Posted by johtani on Tuesday, August 30, 2011

目次

先日、辞書の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"&gt;
      <analyzer&gt;
        <tokenizer class="solr.JapaneseTokenizerFactory" dictionaryDir="/tmp/lucene-gosen/dictionary/ipadic"/&gt;
      </analyzer&gt;
    </fieldType&gt;
    <fieldType name="text_ja_naist_chasen" class="solr.TextField" positionIncrementGap="100"&gt;
      <analyzer&gt;
        <tokenizer class="solr.JapaneseTokenizerFactory" dictionaryDir="/tmp/lucene-gosen/dictionary/naist-chasen"/&gt;
      </analyzer&gt;
    </fieldType&gt;

あと、注意事項です。 普通に考えるとわかることですが、辞書を複数読み込めるようになったことで、読み込んだ複数の辞書をメモリに保持することになります。ですので、今までよりも多くのメモリを利用するので、Heapのサイズには注意が必要です。 例のごとく(ほんとよくない。。。)テストコードを書いていない状態のパッチをまずはアップしました。 テスト書かないと。。。次回はテストコードかきましたと言う報告をしたいな

あと、Robertさんのコメントの前に@shinobu_aokiさんからJapaneseTokenizerFactoryの設定では辞書のディレクトリを$SOLR_HOME/confからの相対パスで記述できるというパッチもいただいています。 この部分については先日と使い方が異なります。 (すみません、まだきちんとソースを見れてないです。。。)


comments powered by Disqus

See Also by Hugo


Related by prelims-cli