Elasticsearch Service (Elastic Cloud)でKuromojiのユーザ辞書を使う方法

概要

同義語辞書を入れたはいいけれど、同義語が展開されたあとの形態素でうまくヒットしなくて困ることがありますよね。
多くの人は、ユーザ辞書と同義語辞書を同時にメンテナンスしているのではないでしょうか。

Elasticsearch Service(Elastic Cloud)は、Elastic社さんが運営するSaaSです。 SaaSなので、ホストに何かを置かなければいけないものは実現できないのか?というと、そうではありません。

ユーザ辞書だけでなく同義語辞書のファイル、自作したプラグインなどを置かせてくれるという心憎い仕様となっております。

Elasticが運営するElasticsearch Serviceは、Amazon Elasticsearch Serviceとは別物なので、そこんとこよろしく。

英語が苦ではない方は、以下を読めば簡単にできます。

www.elastic.co

ここから先は、日本語でスナップショット多めで、実際に手を動かさなくても動かした気になれる感じでやっていきましょう。

手順

大まかに辞書を使うときの手順は、以下の2つです。

  1. 辞書をカスタムプラグインとしてアップロードする
  2. 作成したカスタムプラグインをElasticsearchの設定画面で指定する

以上です。簡単ですね。恐ろしいですね。

カスタムプラグインの作成

新規作成

左側のメニュー「Custom plugins」を選択し、「Add plugin」をボタンを押下します。

f:id:tsgkdt:20190913220518p:plain
プラグイン管理

作成画面

f:id:tsgkdt:20190913220709p:plain
プラグイン作成

項目 説明
Pliugin name プラグイン名を指定します。表示名になります。
Version どのElasticsearchのバージョンで使うかを書きます。
7.*なら、7系で使えるという意味になります
Description 中身を示す説明を書いておきます
Plugin type 「辞書かスクリプトが入った」の方を選択します。

できたら、「Create plugin」を押下します。

辞書ファイルの作成

にがうり,にがうり,ニガウリ,カスタム名詞

こんな1つの単語を登録する辞書ファイルを userdict_ja.txtとして作成しました。

ファイルのアップロード

ここで、辞書ファイルを含んだzipファイルを登録します。

f:id:tsgkdt:20190913221130p:plain

辞書ファイルについては、以下のような構造でzipにしました。

.
└─dictionaries
        userdict_ja.txt

「dictionaries」というフォルダを作って、その下にファイルを置くのが良いです。

添付が成功すると、「Upload successful」と表示されます。

作成確認

左側のメニューより再度、Custom pluginsを選択すると、いま作成したkuromoji用の辞書がカスタムプラグインとして登録できていることが確認できます。

f:id:tsgkdt:20190913221427p:plain

Elasticsearchの設定

次に、カスタムプラグインとして登録できたので、これをElasticsearchで使えるようにしましょう。

Elasticsearch plugins and settings

Elasticsearchの編集画面の中ほどに「Elasticsearch plugins and settings」という箇所があります。

ここを展開すると、先ほど登録したCustom Pluginsが表示されるので、チェックボックスにチェックをいれ、Elasticsearchを編集します。

f:id:tsgkdt:20190913221534p:plain

あとは、保存ボタンを押しましょう。

settings

あとは、辞書ファイルが使えるようになったので、このファイルを使うsettingsをやってみましょう。

PUT forum0913
{
  "settings": {
    "analysis": {
      "analyzer": {
        "kuromoji_dic_analyzer": {
          "type": "custom",
          "tokenizer": "kuromoji_dic_tokenizer",
          "filter": ["synonym"]
        }
      },
      "filter": {
        "synonym": {
          "type": "synonym",
          "synonyms": [
            "ゴーヤ,にがうり"
          ]
        }
      },
      "tokenizer": {
        "kuromoji_dic_tokenizer": {
          "type": "kuromoji_tokenizer",
          "user_dictionary": "userdict_ja.txt"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "item": {
           "type": "text",
            "analyzer": "kuromoji_dic_analyzer"
      }
    }
  }
}

tokenizerの設定の中で、user_dictionaryを指定しているところに着目してください。
先ほどzipにするときは、dictionaries/userdict_ja.txtという階層になっていたはずですが、ここではuserdic_ja.txtと指定してください。

もし、dictionaries/userdict_ja.txt と指定した場合、こんなエラーになります。

  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "IOException while reading user_dictionary_path: /usr/share/elasticsearch/config/dictionaries/userdict_ja.txt"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "IOException while reading user_dictionary_path: /usr/share/elasticsearch/config/dictionaries/userdict_ja.txt",
    "caused_by": {
      "type": "no_such_file_exception",
      "reason": "/usr/share/elasticsearch/config/dictionaries/userdict_ja.txt"
    }
  },
  "status": 400
}

まとめ

辞書ファイルが使える、独自のプラグインが使えるというところは、Elasticsearch Servicceの大きな特徴かと思います。

他にも良い点をあげるとすれば・・・ 1. 新しいバージョンが即日使えるようになる 2. 画面の左側Helpのメニューから、サポートに問い合わせができる。(本家の人が対応してくれる)

決して回し者じゃありませんことよ。ではでは。