Elasticsearchのkuromojiの検索で重要な辞書(dictionary)と類義語(synonym)の設定

Elasticsearchのkuromojiの検索系でとても重要な辞書(dictionary)と類義語(synonym)の設定を行います。

どちらも運用を行なっていく上ではとても重要な設定になります。

検索の精度を上げるといった部分ではこちらの2つの定期的なメンテナンスがとても大事でしょう。

今回の検証では以下の目的では、「きゃりーぱみゅぱみゅ」の単語で試してみます。

★きゃりーぱみゅぱみゅ – Wikipedia
https://ja.wikipedia.org/wiki/%E3%81%8D%E3%82%83%E3%82%8A%E3%83%BC%E3%81%B1%E3%81%BF%E3%82%85%E3%81%B1%E3%81%BF%E3%82%85

正式名称は「きゃろらいんちゃろんぷろっぷきゃりーぱみゅぱみゅ」なんですね。

今回の検証のゴールは以下になります。

  • 「きゃりーぱみゅぱみゅ」が分割されずに検索される
  • 「きゃりーぱみゅぱみゅ」でも「きゃろらいんちゃろんぷろっぷきゃりーぱみゅぱみゅ」でも検索される

 

今回はElasticsearchの6系とkuromojiのプラグインを使って実施しています。

 

プラグインの確認

以下の手順でプラグインの確認を行います。

 

kuromojiが無事入っていますね。

 

辞書なしでセッティング(settings)とマッピング(mapping)を登録して検索を実行

まず、辞書を登録しないで登録してみます。

以下のセッティング(setting)用のファイルを作成します。

 

次にindexの作成を行います。

無事作成されました。

 

次にマッピング(mapping)用のファイルを作成します。

マッピングを反映させます。

 

それでは設定内容の確認をしてみます。

 

では、データを一件登録します。

無事登録されました。

 

それでは検索を実行してみます。

無事、検索されました。

 

さて、ここからが本番です。

analyzeで「きゃりーぱみゅぱみゅ」がどう分解されているか見てみます。

いい感じに分割されちゃってます。

結果としては「きゃ」、「り」、「ー」、「ぱみゅぱみゅ」で分割されてますね。

ということは「きゃ」とか「ぱみゅぱみゅ」で検索しても見つかりますね。

スコアは下がりましたが見つかっているのがわかります。

queryとして「term」でも「match」でも同じスコアで見つかっているのが確認できます。

 

辞書を登録して検索を実行

さて、前置きが長くなりましたが上記の検索で「きゃ」で検索されるのは避けたいところです。

kuromojiでの辞書はセッティング(setting)ファイルで設定します。

辞書としてはCSV形式のファイルで指定して以下のような形式で辞書を記載します。

 

登録した内容は以下になります。

 

分割を「きゃりー」と「ぱみゅぱみゅ」にしたいときは以下のようにします。

 

読みの方もスペースを入れる必要があります。

 

それではセッティング(setting)ファイルを変更します。

 

次にindexの作成を行います。

無事作成されました。

次にマッピング(mapping)を実施します。

マッピングファイルの方は内容は特に変更ありません。

 

それでは設定内容の確認をしてみます。

 

では、データを一件登録します。

 

無事登録されました。

それでは検索を実行してみます。

 

前回の検索よりスコアが上がっています。

さて、analyzeで「きゃりーぱみゅぱみゅ」がどう分解されているか見てみます。

分割されなく一語として登録されています。

 

辞書登録前に検索で引っかかった、「きゃ」とか「ぱみゅぱみゅ」で検索してみます。

 

なかなか興味深いです。

termとして検索してみると検索結果は出なくなりました。

matchとして検索してみると検索結果は引き続き出てくる形となります。

 

類義語(Synonym)を登録して別名での検索を実行

さて、次に「きゃろらいんちゃろんぷろっぷきゃりーぱみゅぱみゅ」でも「きゃりーぱみゅぱみゅ」で登録した単語が検索されるようにします。

類義語は「Synonym Token Filter」というTokenフィルターで設定します。

settingsのJSONに直接記載することもできますし、外部ファイルを使うこともできます。

 

今回は外部ファイルを使って設定します。

ファイルの形式はCSVで類義語となる単語をカンマで区切ります。

今回は以下のようなファイルを用意します。

以下では単語のグルーピングを行なっています。

 

また、Synonymでは以下のように単語を置き換える方法もあります。
(前方はカンマ区切りで複数登録可能)

こちらでは「きゃろらいんちゃろんぷろっぷきゃりーぱみゅぱみゅ」が「きゃりーぱみゅぱみゅ」というTermに置き換えられます。

今回は上の方の設定で行なっています。

 

それではセッティング(setting)ファイルを変更します。

 

次にindexの作成を行います。

無事作成されました。

 

次にマッピング(mapping)を実施します。

マッピングファイルの方は内容は特に変更ありません。

 

それでは設定内容の確認をしてみます。

 

では、データを一件登録します。

 

無事登録されました。

それでは検索を実行してみます。

 

「ちゃろん」という「きゃりーぱみゅぱみゅ」に含まれないものも検索でhitするようになりました。

 

さて、analyzeで「きゃりーぱみゅぱみゅ」(「きゃろらいんちゃろんぷろっぷきゃりーぱみゅぱみゅ」ではなく)がどう分解されているか見てみます。

複雑な分割のされ方をしています。

synonymの方で、「きゃりーぱみゅぱみゅ」「き」「ゃろらいんちゃろんぷろっぷきゃり」「ー」「ぱみゅぱみゅ」にhitするようです。

 

試しに「き」で検索してみます。

termでhitしてしまいました。

 

さすがにこちらでは厳しいのでsynonymとして登録した方も辞書登録します。

 

indexのclose/openで確認をしてみます。

 

さて、再度analyzeで確認してみます。

 

登録されたものは2つになり、辞書の形で整理され変な分割がなくなりました。

 

「き」がhitしないか確認してみます。

hitしてしまいます。

これはすでに登録されたものが分割して登録が作成されているためでしょうか。

 

ドキュメントの削除もreindexも効果なかったので、indexを再度作成してみます。

無事、「き」が検索ではhitしなくなり、「きゃろらいんちゃろんぷろっぷきゃりーぱみゅぱみゅ」がhitするようになりました。

検索の精度をより向上させるためにはsynonymで登録したものもdictionayに登録しておいた方が良さそうです。

また、辞書の登録をした場合はindexの再作成をした方が良いでしょう。

長くなりましたがこの辺で。