伸縮自在の愛 (4)

elasticsearchの使い方について調べると、英語の情報では英語の検索をする用の情報しか出てこない。一方で日本語の情報では日本語の検索をする用の情報ばかり。



"世界"の"中心"の"日本人(ジャパニーズ)" 用のサービスであったとしても日本語と英語のコンテンツが混在していることもあるだろう。
kuromojiはあくまでも日本語形態素解析を行うものであって、英文はそれほどうまく扱えない。

  

この問題に対処するいちばん簡単な解決法は、同じフィールドに何通りかのアナライザーを適用してインデックスを構築するというものである。
複数言語に対応させるだけでなく、同じフィールドの完全一致検索と普通の検索両方を提供するのにも使える。たとえば「ユーザー名」は日本語サービスでもアルファベット限定であることも多いが、n-gramと完全一致の両方で検索できたほうが便利そうじゃない?

Railsでelasticsearch-modelを使う場合は、こういうふうにインデックスを設定するとよい。


elasticsearch1.0より前ではmulti-field typeというものがあったそうだが、1.0以降では使えないので注意。
ただし名前がなくなっただけで、同じ機能は残っている。単にfield内に入れ子にするだけで複数のアナライザーを適用可能なのである。
当然、インデックスサイズは大きくなる。

このコードでインデックスを構築すると、三種類の検索ができるようになる。
"title"に対してクエリを出せば両方のインデックス、"title.en"では英語用のインデックスのみ、"title.ja"では日本語用インデックスのみを使って検索を行う。


おまけ。

elasticsearchを別サーバーで動かしたいなら、initializer内に適当なファイルを作っておいて、その中で

Article.__elasticsearch__.client = Elasticsearch::Client.new host: host._ip

みたいに設定すると、localhostではなくhost_ipで指定したサーバーを使ってくれる。


次回は、アナライザーについて。