Elasticsearch Sudachi
Sudachiプラグインである。最新バージョンではElasticsearchの古いバージョンがサポートされなくなった。このサイトは7.10.2で稼働しているので最新のプラグインはサポート対象外となる。というわけで、開発元のGitHubから古いブランチを落としてきて7.10.2対応のプラグインを作成する手順を残しておくことにする。まずは古いブランチのクローンから。
git clone -b v3.3.0 https://github.com/WorksApplications/elasticsearch-sudachi
ビルドは以下のコマンドを実行する。
./gradlew -PengineVersion=es:7.10.2 build
正常に終了すると、build/distributions/フォルダにプラグインが作成される。プラグインのインストールは以下のコマンドで行う。
./elasticsearch-plugin install file:///file/path/elasticsearch-7.10.2-analysis-sudachi-3.3.1.zip
ユーザー辞書のビルドにはSudachipyが必要なのでインストールするのだが、CPUがARM系だとひと手間余分にかかるので注意が必要。RustのToolchainのインストールとPythonのパッケージが必要なので、以下のコマンドで追加する。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh pip install setuptools_rust
shellを再起動してrustのパスを有効化する。そして以下のコマンドでSudachipyのインストールを行う。
pip install sudachipy sudachidict_full
ユーザー辞書は以下のようなテキストファイル(user_dic.txtなど)を作成しておく。
ローグ・ワン,4786,4786,-32768,ローグ・ワン,名詞,固有名詞,一般,*,*,*,ローグワン,ローグ・ワン,*,*,*,*,* rogue one,4786,4786,-32768,rogue one,名詞,固有名詞,一般,*,*,*,ローグワン,ローグ・ワン,*,*,*,*,* rogueone,4786,4786,-32768,rogueone,名詞,固有名詞,一般,*,*,*,ローグワン,ローグ・ワン,*,*,*,*,*
ユーザー辞書のビルドは以下のコマンドで行う。
sudachipy ubuild -d full -o user_dict.dic -s <sudachi_dict> user_dic.txt
SudachiのElasticsearch用設定ファイル(sudachi.json)と辞書は、/etcの下のElasticsearch用フォルダ(/etc/elasticsearchなど)のsudachiフォルダ(/etc/elasticsearch/sudachi)下に置いておく。sudachi.jsonの内容は以下の通り。
{
"systemDict" : "system_full.dic",
"inputTextPlugin" : [
{ "class" : "com.worksap.nlp.sudachi.DefaultInputTextPlugin" },
{ "class" : "com.worksap.nlp.sudachi.ProlongedSoundMarkInputTextPlugin",
"prolongedSoundMarks": ["ー", "-", "?", "~", "?"],
"replacementSymbol": "ー"}
],
"oovProviderPlugin" : [
{ "class" : "com.worksap.nlp.sudachi.MeCabOovProviderPlugin" },
{ "class" : "com.worksap.nlp.sudachi.SimpleOovProviderPlugin",
"oovPOS" : [ "補助記号", "一般", "*", "*", "*", "*" ],
"leftId" : 5968,
"rightId" : 5968,
"cost" : 3857 }
],
"pathRewritePlugin" : [
{ "class" : "com.worksap.nlp.sudachi.JoinNumericPlugin",
"joinKanjiNumeric" : true },
{ "class" : "com.worksap.nlp.sudachi.JoinKatakanaOovPlugin",
"oovPOS" : [ "名詞", "普通名詞", "一般", "*", "*", "*" ],
"minLength" : 3
}
]
}
ElasticPressの辞書指定は以下の通り。
'analysis' => array(
'tokenizer' => array(
'sudachi_tokenizer' => array(
'type' => 'sudachi_tokenizer',
'split_mode' => 'A',
'additional_settings' => '{"systemDict":"system_full.dic","userDict":["user_dict.dic"]}'
),
),
'analyzer' => array(
ここでは「additional_settings」でダイレクトにシステム辞書とユーザー辞書を指定する方法とした。