🍊

Solr9:Solr用のSudachiプラグインで複数のユーザー辞書を使う

2024/08/02に公開

Unidicは短単位で短く区切られすぎるきらいがあるので、Elasticsearch向けには公式プラグインが存在するSudachiをSolrでも使ってみたいなーと思い探してみたところ、Solr向けにプラグインを作っている方がいました。

https://github.com/azagniotov/solr-lucene-analyzer-sudachi

単純に導入するだけならば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