# 更新直後の検索クエリの結果が不整合になる

**URL:** <https://discuss.elastic.co/t/topic/141865>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [July 27, 2018, 3:40am UTC](https://discuss.elastic.co/t/topic/141865 "2018-07-27T03:40:56Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Skane](https://avatars.discourse-cdn.com/v4/letter/s/bbe5ce/32.png) [@Skane](https://discuss.elastic.co/u/Skane)\
**Post date:** [July 27, 2018, 3:40am UTC](https://discuss.elastic.co/t/topic/141865/1 "2018-07-27T03:40:56Z")

</div>

Elasticsearchにノード数4、シャード数8、レプリカ1で設定されたIndexに対して、以下のような現象が発生しました。

■事象

1. APIで新しい上記のIndexにドキュメントを作成し更新
2. \_searchクエリから検索を行い結果を取得。1のドキュメントも結果に含まれている
3. \_searchクエリから検索を行い結果を取得。1のドキュメントが結果に含まれず
4. \_searchクエリから検索を行い結果を取得。1のドキュメントも結果に含まれている

■事象の詳細  
・2〜4は一つのプロセスで2から順番に処理が流れている。  
・多少クエリの内容が違いますが、1の結果は取得できるようなクエリになっている。  
・1のみ非同期で処理が走っており、2の処理開始とほぼ同時に1の処理が完了していた。  
・期待値としては、2〜４のクエリ結果に1が含まれて欲しい  
・数分後に同じ処理を流したが期待通り2〜4の結果に1のドキュメントが含まれてた。  
・1〜4を時系列に並べると全て1s以内での処理になっている  
・refresh\_intervalはデフォルトの1sのままである

ここで質問ですが、  
上記の事象が起きた原因としては、  
2と4のクエリは書き込まれが反映されているたプライマリシャードを読みにいき、  
1の更新結果がレプリカに反映されていない状態で、3のクエリがレプリカシャードを読みにいったということでしょうか？

また、今後同じような事象を避けたいのですが、方法としては1のAPIで強制リフレッシュするのがよいのでしょうか？

もしかしたら基本的な内容に対する質問かもしれませんが、何卒よろしくお願いいたします。

---

<div class="post-metadata">

**Author:** ![mnozawa](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mnozawa/32/15091_2.png) [@mnozawa](https://discuss.elastic.co/u/mnozawa)\
**Post date:** [July 27, 2018, 6:49am UTC](https://discuss.elastic.co/t/topic/141865/2 "2018-07-27T06:49:49Z")

</div>

refreshに関しては、1. のデータ投入時に`refresh=true`もしくは`refresh=wait_for`のパラメータをつけるのが良いと思います。  
[https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-refresh.html](https://www.elastic.co/guide/en/elasticsearch/reference/master/docs-refresh.html)

ただ、1の完了を待たずに2が動くことがあるのなら、結局「データ投入が(完全に)終わる前に検索しに行く」ケースは残りそうに思います。

---

<div class="post-metadata">

**Author:** ![Skane](https://avatars.discourse-cdn.com/v4/letter/s/bbe5ce/32.png) [@Skane](https://discuss.elastic.co/u/Skane)\
**Post date:** [July 27, 2018, 9:18am UTC](https://discuss.elastic.co/t/topic/141865/3 "2018-07-27T09:18:30Z")

</div>

ご回答ありがとうございます

```
ただ、1の完了を待たずに2が動くことがあるのなら、結局「データ投入が(完全に)終わる前に検索しに行く」ケースは残りそうに思います。

```

説明不足で申し訳ありませんが、  
データ投入が完全に終わる前に2の検索クエリで引っかからない場合は、  
以降の処理はスキップされ、数秒後、2から再処理が始まる仕組みになっておりますので、  
問題が起こらないようになっているのですが、  
2の検索クエリで引っかかったのに3の検索で引っかからなかったことが問題となっております。  
そういった事が有り得るということでしょうか？

一応、補足になりますが、クエリに指定してあるsizeかもと思いましたが、  
クエリの結果取得件数は指定したsizeよりも少なかったため、クエリのsize指定が原因ではなさそうです。

後申し訳ございませんが、  
Elasticsearchのバージョンを書き忘れておりましたが、5.6.8になります

---

<div class="post-metadata">

**Author:** ![mnozawa](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mnozawa/32/15091_2.png) [@mnozawa](https://discuss.elastic.co/u/mnozawa)\
**Post date:** [July 27, 2018, 10:15am UTC](https://discuss.elastic.co/t/topic/141865/4 "2018-07-27T10:15:06Z")

</div>

> [@Skane](#):
>
> データ投入が完全に終わる前に2の検索クエリで引っかからない場合は、  
> 以降の処理はスキップされ、数秒後、2から再処理が始まる仕組み

これなら大丈夫そうですね、失礼しました。

相当古いバージョンではありますが、検索のたびに特定のデータが見えたり見えなかったりするケースはわたしも経験があります。そのときは原因までは突き止めていませんが、前述の通りなんらかの形で検索前にrefreshが走るように工夫すると解消するかもしれません。

---

<div class="post-metadata">

**Author:** ![Skane](https://avatars.discourse-cdn.com/v4/letter/s/bbe5ce/32.png) [@Skane](https://discuss.elastic.co/u/Skane)\
**Post date:** [July 30, 2018, 4:41am UTC](https://discuss.elastic.co/t/topic/141865/5 "2018-07-30T04:41:39Z")

</div>

1年以上動かしていた処理で一度しか発生していないので、  
今後同じことが発生するか分かりませんが、  
事象が発生してしまった場合、アプリケーション側で何らか対策取る方法を探ろうと思います。  
回答ありがとうございました

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [August 27, 2018, 4:41am UTC](https://discuss.elastic.co/t/topic/141865/6 "2018-08-27T04:41:55Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
