satococoa's blog

主にサーバーサイド、Web 系エンジニアのブログです。Go, Ruby, React, GCP, ...etc.

AWS CloudSearch を使ってみた

Elasticsearch を調べたあと、最近は CloudSearch も機能強化されて日本語の検索も簡単にできていることを知り、いろいろ試して使ってみました。 結果、すごく良さそうなので今開発中のプロジェクトで採用することにしました。

調査しつついろいろコツというか知っておくべき点があったのでメモを残しておきます。 Elasticsearch との比較という観点で調査・検証していたので、Elasticsearch をある程度知った状態で読んでいただいた方がいいかも。

CloudSearch と Elasticsearch の比較

  • Elasticsearch ではシャード数は index 作成時に決定しなくてはならないが、CloudSearch なら自動でスケールアップしてくれる。
  • 検索のパフォーマンスに関しては Elasticserch でもあとから replica 追加可能なのでスケールアウト可能。しかし、インデックス更新のパフォーマンスは上げられない。
  • 日本語検索は両者とも ok
  • 特定の条件を重要視したスコアリングなども両者とも ok
  • CloudSearch の場合、インデックスの作成や構造を変更するとき (カラムの追加とか) にはかなり時間がかかる + 別途料金 (1GB あたり 0.98 USD) がかかるので注意が必要。

CloudSearch を使う上で知っておきたいこと

インデックスの更新について

  • インデックスの更新は "add" と "delete" の2種類で、それぞれ JSON をアップロードすることで更新する。
  • add は常に上書き更新となり、一部のカラムだけ更新とかはできない。
  • 複数の add, delete の操作をまとめて送ることができて(その単位をドキュメントバッチと呼ぶ)、なるべくドキュメントバッチのサイズ上限である 5MB に近いデータを送るようにした方がパフォーマンスがいいらしい。
    • 僕はいったん更新/削除用の json をデータベースに貯めておいて、一定時間おきに sidekiq で最大 5MB ずつのバッチに分けてアップロードしています。
  • json 以外のデータもアップロードできるらしいけど、そのユースケースが自分にはないので調べてないです。
  • インデックス上のドキュメントを識別するための id は ActiveRecord のオブジェクトの id でももちろん ok

料金体系

  • 次の 4つで課金されます。 -> インスタンス料金、ドキュメントの更新、インデックスの再構築、データ転送
  • うち、インスタンス料金以外はかなり安いので無視してもよさそう。
  • ちなみに最低で 0.082 * 24時間 * 30日 = $59.04/月 くらい (マルチAZ無し)

参考文献