Solr9:Solr用のSudachiプラグインで複数のユーザー辞書を使う
Unidicは短単位で短く区切られすぎるきらいがあるので、Elasticsearch向けには公式プラグインが存在するSudachiをSolrでも使ってみたいなーと思い探してみたところ、Solr向けにプラグインを作っている方がいました。
単純に導入するだけならばREADMEの通りに実行すれば良かったです。しかし、Kuromojiのようにtokenizerのパラメーターに「userDictionary="lang/userdict_ja.txt"」などと指定することによって複数のユーザー辞書を使い分けることができなかったので、複数のユーザー辞書を使い分ける方法を探ってみました。
READMEに記述してあるソースをcloneした状態を前提とします。
ユーザー辞書の編集
user-dictionary/user_lexicon.csv を編集します。
辞書のフォーマットはSudachi ユーザー辞書作成方法に従います。
ユーザー辞書の出力先の変更
./gradlew configureDictionariesLocally
や
./gradlew buildUserDictionary
を実行することによってシステム辞書とユーザー辞書が作成されますが、その出力先のデフォルトは/tmp/sudachiです。これを変更したい場合はconf/gradle/sudachi.gradleのtargetDirを編集します。
例:
plugins.withType(JavaPlugin) {
ext {
targetDir = file("/tmp/sudachi/[任意のディレクトリ名]")
ここで注意が必要なのは、出力先のパスはSolrのセキュリティポリシーの制限を受けることです。具体的にはSolrがインストールされたディレクトリにあるserver/etc/security.policy でreadが許可されたディレクトリである必要があります。
ファイルシステムのパーミションだけに気を取られていて、これでちょっとハマりました。
Sudachiが参照するユーザー辞書のパスの変更
Sudachiがシステム辞書、ユーザー辞書を参照するパスはsrc/main/java/io/github/azagniotov/lucene/analysis/ja/sudachi/tokenizer/SudachiTokenizerFactory.javaに定数定義されているので、このパスを上記で変更したユーザー辞書の出力先に合わせることでSolrの起動時、もしくはコア/コレクションのロード時にシステム辞書、ユーザー辞書がメモリに読み込まれます。
例:
private static final String SYSTEM_DICT_LOCAL_PATH = "/tmp/sudachi/[任意のディレクトリ名]/system-dict/system.dict";
private static final String USER_DICT_LOCAL_PATH = "/tmp/sudachi/[任意のディレクトリ名]/user_lexicon.dict";
あとはREADMEの手順通り、
./gradlew -PsolrVersion=9.4.0 assemble
を実行することで日本語形態素解析器としてのSudachiがbuild/libs/solr-lucene-analyzer-sudachi-1.0.0-SNAPSHOT.jar に得られます。
このjarファイルの名前を好きな名前でビルドしたい場合はgradle.propertiesを編集して変えることができます。
Solrのコア/コレクションにおけるjarファイルのパス設定
それぞれ別のユーザー辞書を参照するパスを定義した複数のjarファイルをSolrが読み込み可能なディレクトリに配置し、Solrのコア/コレクションの設定ファイルであるsolrconfig.xmlにjarへのパスを記述することで、コア/コレクション毎に別のユーザー辞書を運用することができます。
solrconfig.xmlの例:
<lib path="${solr.install.dir:../../../..}/modules/sudachi/solr-lucene-analyzer-sudachi-1.0.0-SNAPSHOT.jar" />
まとめ
ユーザー辞書の編集:user-dictionary/user_lexicon.csv
システム辞書、ユーザー辞書の出力先定義:conf/gradle/sudachi.gradle
システム辞書、ユーザー辞書の読み込み先定義:src/main/java/io/github/azagniotov/lucene/analysis/ja/sudachi/tokenizer/SudachiTokenizerFactory.java
Sudachiをビルドしたjarのファイル名変更:gradle.properties
コア/コレクションにおけるjarのパス記述:solrconfig.xml
結構めんどくさいですね。分けたいユーザー辞書の数だけjarを設けることになるので、メモリ的にもやさしくないです。
Discussion