Elasticsearchで連続して操作するときはrefreshを追加する

Elasticsearchで連続して操作するときはrefreshを追加する

Elasticsearchで連続して操作(Index, Update, Delete)する場合、Elasticsearchは非同期で処理されるため実行順序が担保されません。
結果、意図しない結果になったり想定外のエラーが投げられることになります。

refreshパラメータを追加する

リクエストパラメータに refresh を追加して true を指定すると「関連するプライマリシャードとレプリカシャード(インデックス全体ではない)を更新して、更新されたドキュメントが検索結果にすぐに表示される」ため、同期処理のように実行順序が担保されます。

ただし、パフォーマンス低下に繋がるため必要性や影響を考慮した上で使用した方が良さそうです。

参考: ?refresh | Elasticsearch

refresh パラメータ

説明
空文字列あるいはtrue 更新されたドキュメントがすぐに検索結果に現れるように、 操作が発生した直後に関連するプライマリシャードやレプリカシャードを (インデックス全体ではなく) リフレッシュします。
これは、インデックス作成と検索の両方の観点から、パフォーマンス低下につながらないことを十分に検討・確認した上で行うべきです。
wait_for リクエストによる変更がリフレッシュによって可視化されるのを待ってから返信します。これは即座にリフレッシュを強制するのではなく、リフレッシュが起こるのを待ちます。
Elasticsearchは自動的に、index.refresh_interval(デフォルトは1秒)ごとに、変更のあったシャードをリフレッシュします。この設定は動的です。Refresh APIを呼び出したり、それをサポートするAPIでrefreshをtrueに設定したりしてもリフレッシュが行われ、その結果、refresh=wait_forですでに実行中のリクエストが返されることになります。
false (デフォルト) リフレッシュに関連するアクションを取りません。このリクエストによって行われた変更は、リクエストが戻った後のある時点で可視化されます。

プログラミングカテゴリの最新記事