検索のドキュメントとそのサジェストのドキュメントについて。


(MarketVS) #1

Elasticsearch を使ってメインの検索とそのサジェストを作るときは同じindex以下にメインの検索のtypeとそのサジェストのtypeの2つtypeを作るか、あるいはメインの検索のindexとそのサジェストのindex、合わせて2つindexを作ることが考えられるのですが、ユースケースによるでしょうが、多くの場合どちらの方が一般的かつ、最適でしょうか。
宜しくお願い致します。


#2

この質問をされるということは、恐らくMarketVSさんはElasticsearch 5.x以前をお使いだと思うのですが、Elasticsearch 6.0.0以降では同じindexに複数のtypeを作成することができなくなっています。

https://www.elastic.co/guide/en/elasticsearch/reference/6.5/removal-of-types.html

したがって、

  • 同じindex以下にメインの検索のtypeとそのサジェストのtypeの2つtypeを作る
  • メインの検索のindexとそのサジェストのindex、合わせて2つindexを作る

の2つの選択肢があるとき、現在の最新バージョンでは後者しか実現することができません。仮に過去のバージョンをお使いだったとしても、バージョンアップのしやすさなどを考えて後者にすることをオススメします。

...と、ここまで書いていて思ったのですが、_typeフィールドを使うのではなくて、独自のtypeフィールドを作成して運用していくイメージでしょうか?
このあたり検索に詳しい人が来てくれると嬉しいですね。(私は検索は詳しくないので、もしかしたら…ということで、制約の話だけ書き残していきます。)


(Sunggyu Kei Rhie) #3

こんばんはー

@j-yamaさんから検索やってる人を呼ばれた気がしたので。。。

主に飲食店の店名検索で実運用を行ってる私の経験に基づく事例としてですが、
ご参考いただければと思います。

検索用Indexとサジェスト用のIndexは分けたほうが良いと思います。

同じIndex内での異なるtypeだとしても同じfield名では同じdata typeの設定出ないといけないので、
検索とサジェストには同じデータに対するsearchクエリを投げるとしてもanalyzerの設定などをそれぞれ別途設定したいことが多いので、不自由で分離したくなります。

もっと言うと、トラフィックが結構あるのであれば、
クラスターも分けて
サジェスト用クラスターはレスポンスやスループットに重みをおいた設計にして、
検索用クラスターは大量のデータや複雑なスコアリングに対応できる設計にします。

クラウド上でしたら使うインスタンスタイプやSSD/NVMeなども変わってくるかもしれませんね。

なので私はindexは分ける、クラスターもかなりトラフィックがあるのであれば、できれば分ける運用が良いと思ってます。


(MarketVS) #4

上記お二方、ご回答ありがとうございます。
おっしゃる通りで、Elasticsearch最新版は複数のtypeをサポートしていないことに加え、indexのanalyzerも検索とサジェストで異なるものになってくると思うので、indexは分けた方が良いですね。

elastic cloudの利用を検討していますが、上記の限りですと、インスタンスタイプに関しては、検索とサジェストとも、下記url内の3. Optimize your deployment のところの"I/O Optimized"の選択になりますでしょうか。
https://cloud.elastic.co/pricing
また、日本語のサジェストの実装関しては、良質と言えるような記事が、


くらいしか探すことができなかったのですが、2015年12月の記事ということで、情報が少しばかり古いということが懸念です。Elastic search内部の機能でもサジェストはフォローされているようですが、日本語に関してはまだ弱いという認識を持っております。みなさまはどういった資料を参考にして、日本語のサジェストを行なっているのでしょうか。参考情報などご存知であれな、できれば教えていただきたく思います。宜しくお願い致します。


(Sunggyu Kei Rhie) #5

基本はKidoさんの内容で問題ないです。
日本語サジェストでは本当にいい内容ですし、多く変わってないと思います。
おっしゃる通り、Completion Suggesterとかで日本語をどうサジェストするかはあんまりノウハウがないように思えますので、analyzerと検索クエリの組み合わせ、field構成=データ設計など用いてサジェストを作ってます。

私の事例でもよろしければ参考にしていただければと思います。


(MarketVS) #6

ご返信ありがとうございます。
それでは、サジェストはKidoさんのものをベースとしつつ、ご提示していただいた資料も参考にさせていただきたいと思います。