タイトルの通りです。
サービスで AWS Elasticsearch service の利用を検討している方は注意してください。
ユーザー辞書ってなに?
Elasticsearchをあまり知らない人向けに説明しますと、文章を検索可能にする際には形態素解析を行います。
ElasticsearchにおいてはKuromojiというアナライザーを用いてこれを行いますが、これには辞書データが必要なのです。
例えば、
すもももももももものうち
上記の文章は次のように分解できます。
すもも も もも も もも の うち
アナライザーがすもも
ともも
を認識して分解するためには、これらの単語を知っている必要があります。
このデータソースが辞書データと呼ばれる物です。
あなたが考えている検索が、インターネット上に散らばる最新の単語を含むような場合、
あなたは最新の辞書データを作りつづけ、それをアナライザーの辞書データとして登録する必要があります。
AWS Elasticsearch service はこれができません
じゃあどうすればいいの?
選択肢1: 自分でクラスターを構成する
AWSのマネージドElasticsearch serviceを使わず、EC2でElastciseachを構成します。
マネージドではない分管理が大変になりますが、その分対応していないElasticsearchのバージョンが利用できたり、ユーザー辞書の登録ができたりと自由を得られます。
選択肢2: N-gramを併用する
辞書データを作成することはそもそも大変です。
次々に生まれる日本語の造語に対応しようとすると、N-gramが選択肢に挙がってきます。
N-gramとは、文章をn個の文字で分割する方法です。必ずしも目的の単語で分割できるとは限りませんが、辞書にない単語でも検索できることがあります。
マッピングの設定では次のように設定することで、KuromojiとN-gramで分割したデータを定義できます。
textforsearch:
type: text
analyzer: kuromoji
copy_to: textforseach_ng
textforsearch_ng:
type: text
analyzer: ja_ngram
検索の際はtextforsearch
とtextforsearch_ng
を検索対象に設定することで、ある程度検索を改善できるでしょう。
私が過去に開発に参加したサービスでは、この方法を用いてSNSサービスのインデックスを作成しています。
感想としては、特に問題ない印象です。
終わりに
Elasticsearch service でユーザー辞書が使えない件については、いろんな解説記事でわずかに書かれている程度でしたので、思いっきり啓蒙のために書いておきました。
AWSの人にも確認しましたが、申し訳ないが辞書登録出来ないんですごめんなさい! って言ってました。
散々利用できるようにしてほしいという声はあるようなので、いつか対応することを願います。
利用を検討している人に届くことを願う。
参考資料
Elasticsearch の Kuromoji でユーザー辞書を使う
https://qiita.com/kijtra/items/d391179e1ea0be65e3f5
N-gramを作る
https://qiita.com/kazmaw/items/4df328cba6429ec210fb
Elasticsearchの辞書・同義語を調整して『築地銀だこ』の検索をカスタマイズした
https://blog.rista.jp/entry/2018/03/27/100100