Elasticsearchにおける**「形態素解析(けいたいそかいせき)」とは、人間が書いた文章を、検索エンジンが理解しやすいように「意味のある最小単位(単語)」に分割する作業**のことです。
英語の場合は「単語がスペースで区切られている」ので分割が簡単ですが、日本語は単語が繋がっているため、専用の辞書(プラグイン)がないと正しく検索できません。
なぜ「Kuromoji」が必要なのか?
例えば、**「東京都現代美術館」**という言葉を検索したい場合、Elasticsearchに標準の(日本語を知らない)設定で読み込ませると、文字をバラバラにしてしまいます。
- 標準(1文字ずつ): 「東」「京」「都」「現」「代」…
- Kuromoji(形態素解析): 「東京」「都」「現代」「美術館」
このように、意味のある単語として認識させることで、検索精度が劇的に上がります。
Kuromojiがないと起こる問題
- ノイズが多い: 「すもももももも」を検索しようとすると、「も」という1文字が含まれるすべてのファイルがヒットしてしまい、関係ないものばかり出てくる。
- 検索漏れ: 単語の区切りを無視して検索するため、Macから特定のキーワードで検索しても、Elasticsearch側が「それは単語ではない」と判断して結果を返さない。
Kuromojiを導入する手順(Linux側)
Elasticsearchが動いているLinuxサーバーで以下の操作を行います。
1. プラグインのインストール
Elasticsearchのバージョンに合わせた analysis-kuromoji をインストールします。
Bash
# Elasticsearchのインストールディレクトリにあるbin/elasticsearch-pluginを使用
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
2. サービスの再起動
インストール後は必ず再起動が必要です。
Bash
sudo systemctl restart elasticsearch
3. インデックス設定の変更
ここが少し厄介なのですが、プラグインを入れただけでは、既存のインデックス(すでにスキャン済みのデータ)には適用されません。
fs2es-indexer の設定ファイルや、Elasticsearchのインデックス作成時の設定(マッピング)で、analyzer: kuromoji を使用するように指定する必要があります。
導入のポイント:N-gram(文字分割)との違い
「文字が入っているのにヒットしない」問題を解決する手法には、大きく2つあります。
| 手法 | 特徴 | メリット |
| Kuromoji (形態素解析) | 辞書を使って「単語」で分ける | 精度が高い(正しい単語でヒットする) |
| N-gram (文字分割) | 2文字ずつなど、機械的に分ける | 辞書にない造語や型番、略語でも必ずヒットする |
もし、あなたの扱うファイルが**「一般的な日本語の文章」であれば Kuromoji がおすすめですが、「特殊な型番や製品名、略称」**が多い場合は N-gram 設定の方が「検索漏れ」はなくなります。
現在、fs2es-indexer でどのような設定(YAMLファイルなど)を使用されていますか?もし可能であれば、設定の一部を教えていただければ、どこを修正すべきかアドバイスできます。

コメント