概要

Elasticsearchに標準のkuromojiではなくSudachiを利用した、日本語の形態素解析を行うDockerイメージを作成する方法について説明します。

環境

  • Elasticsearch 8.6.2

やりたいこと

Elasticsearchの標準機能では、日本語の検索精度が十分とは言えません。これは日本語の文字列に最適化された検索システムを持っていないためです。

そのため、Elasticsearchは公式でkuromojiという日本語で使える形態素解析のプラグインを提供しています。

公式のプラグインを利用してもよいですが、今回はkuromojiよりも評価の高いSudachiを利用して、形態素解析を行います。

私は、ElasticsearchをDockerのコンテナで実行しているため、SudachiをインストールしたDockerイメージを作成する方法について紹介します。

イメージの作成

ElasticsearchでSudachiを使用するには、Elasticsearchのプラグインをインストールして、さらにSudachiの辞書データや設定ファイルをイメージの中に含めます。

また、SudachiのElasticsearchプラグインは、Elasticsearchの最新バージョンで使用できるとは限りません。プラグインのバージョンとElasticsearchのバージョンを合わせる必要があります。

バージョンの対応は、次のGitHubのリポジトリに記載されています。

GitHub - WorksApplications/elasticsearch-sudachi: The Japanese analysis plugin for elasticsearch

今回インストールするプラグインは、Elasticsearchの8.0~8.6に対応しているため、元々インストールしようと考えていた8.6.2に対応しているため、そのままインストールします。

Sudachiを使用するには、辞書ファイルが必要です。辞書ファイルは次の場所からダウンロードできます。辞書ファイルにはcore、small、fullの3つがあり、今回は形態素解析の精度を高めたいため、全てのデータが記載されているfullを使用します。

SudachiDict

さらに、Sudachiを使用するには設定ファイルが必要です。設定ファイルは、sudachi.jsonという名前で次のようにします。full以外の辞書を使用している場合は、2行目のsystem_full.dicの記述を変更してください。

{
    "systemDict": "system_full.dic",
    "characterDefinitionFile": "char.def",
    "inputTextPlugin": [{
            "class": "com.worksap.nlp.sudachi.DefaultInputTextPlugin"
        },
        {
            "class": "com.worksap.nlp.sudachi.ProlongedSoundMarkInputTextPlugin",
            "prolongedSoundMarks": ["ー", "-", "⁓", "〜", "〰"],
            "replacementSymbol": "ー"
        },
        {
            "class": "com.worksap.nlp.sudachi.IgnoreYomiganaPlugin",
            "leftBrackets": ["(", "("],
            "rightBrackets": [")", ")"],
            "maxYomiganaLength": 4
        }
    ],
    "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
        }
    ],
    "formatterPlugin": [{
            "class": "com.worksap.nlp.sudachi.SimpleMorphemeFormatter"
        },
        {
            "class": "com.worksap.nlp.sudachi.WordSegmentationFormatter",
            "eos": "\\n"
        },
        {
            "class": "com.worksap.nlp.sudachi.WordSegmentationFormatter",
            "eos": " "
        }
    ]
}

これらを使用して、Docker イメージを作成する Dockerfile を以下に示します。実行時には、sudachi.json ファイルを Docker コマンドを実行するディレクトリに配置してください。

FROM docker.elastic.co/elasticsearch/elasticsearch:8.6.2

ARG ES_VERSION="8.6.2"
ARG SUDACHI_VERSION="3.0.1"
ARG SUDACHI_DIC_NAME_ZIP="sudachi-dictionary-20230110-full.zip"
ARG SUDACHI_DIC_NAME="sudachi-dictionary-20230110"

RUN bin/elasticsearch-plugin install <https://github.com/WorksApplications/elasticsearch-sudachi/releases/download/v3.0.1/analysis-sudachi-${ES_VERSION}-${SUDACHI_VERSION}.zip>

RUN mkdir -p /usr/share/elasticsearch/config/sudachi && \\
    chown elasticsearch:root /usr/share/elasticsearch/config/sudachi

RUN curl -Lo ${SUDACHI_DIC_NAME_ZIP} <http://sudachi.s3-website-ap-northeast-1.amazonaws.com/sudachidict/${SUDACHI_DIC_NAME_ZIP}> && \\
    unzip ${SUDACHI_DIC_NAME_ZIP} && \\
    mv ${SUDACHI_DIC_NAME}/system_full.dic /usr/share/elasticsearch/config/sudachi && \\
    rm -rf ${SUDACHI_DIC_NAME_ZIP} ${SUDACHI_DIC_NAME}

COPY sudachi.json /usr/share/elasticsearch/config/sudachi

公式が用意しているDockerイメージを元に、Sudachiプラグインのインストールや辞書ファイルのダウンロードなどを行っています。

利用するバージョン毎に微妙に実行するコマンドが変わるため、辞書ファイルの名前やバージョンの値などは適宜変更して実行してください。

さいごに

ダウンロードした辞書ファイルを置く場所を間違えたりしたために、手間取りました。