Tagbangers Blog

Hibernate Search で Elasticsearch を使用したらの bulk ではまった

なにが起きたのか?

Hibernate Search は Elasticsearch にも対応しています。
今回、既存のアプリケーションで Elasticsearch に対応した際に、Hibernate Search の MassIndexer を使用して検索用インデックスを再生成を行いました。

その際、作成に失敗することがありましたので書きとめておきたいと思います。

結論

今回色々調べましたが、結論からいいますと。。

Elasticsearch がバッチで処理できるサイズを超えてしまい、Elasticsearch で生成に失敗、最終的に Hibernate Search の処理がエラーになる。

ということが起きていました。

分かってしまえば大した原因ではないのですが、疲れました。

Elasticsearch の バッチ処理

バッチ処理 - Elasticsearch -

ドキュメントにも記述がありますが、Elasticsearch のバッチ処理では、途中で失敗しても処理を継続するという仕様です。
バッチ処理においては、継続してもらったほうが助かりますのでこの仕様に大きな問題はありません。

Hibernate Search のバッチ処理

Hibernate Search の Elasticsearch 対応では Elasticsearch へのリクエストは全て成功することが前提で処理が行われるようです。
このとき、 Elasticsearch でエラーが発生すると、 Hibernate Search が求めるレスポンスが帰ってこないため後続の処理が失敗します。

どうする??

今回は AWS の Amazon Elasticsearch Service を使用するケースだったので、単純にインスタンスタイプを大きいものに変更して対応しました。

全く同じ状況ではありませんでしたが、以下がヒントになりました。
Amazon ES での 429 エラー「es_rejected_execution_exception」を解決するにはどうすればよいですか?

まとめ

今回の現象、私のローカルでは起きませんでした。(開発時は Docker で Elasticsearch をたててテストしていました
きっと、 Macbook Pro はそれなりに強いんでしょう。(ありがとうタグバンガーズ)

Hibernate Search が Elasticsearch に対応したことにより、Hibernate Search を使用しているアプリケーションでは気軽に Elasticsearch を採用できるようになりました。
何も考えずにサクッと使用出来る代物では無いかもしれませんが、非常に強力な組み合わせだと思いますので、
もっと仲良くなって、使いこなしたいと思います。