?refresh

このインデックス更新削除、およびバルク API は、refresh を設定して、このリクエストによって行われた変更が検索に表示されるタイミングを制御することをサポートしています。許可されている値は次のとおりです:

  • 空の文字列または true
  • 操作が発生した直後に関連するプライマリおよびレプリカシャード(インデックス全体ではなく)を即座にリフレッシュし、更新されたドキュメントが検索結果にすぐに表示されるようにします。これは、インデックス作成と検索の両方の観点からパフォーマンスが低下しないことを慎重に考慮し、検証した後にのみ行うべきです。
  • wait_for
  • 応答する前に、リクエストによって行われた変更がリフレッシュによって表示されるのを待ちます。これは即時のリフレッシュを強制するものではなく、リフレッシュが発生するのを待ちます。Elasticsearch は、index.refresh_interval ごとに変更されたシャードを自動的にリフレッシュします。デフォルトは1秒です。その設定は動的です。リフレッシュ API を呼び出すか、refreshtrue に設定すると、リフレッシュが発生し、refresh=wait_for を持つ既存のリクエストが返されます。
  • false(デフォルト)
  • リフレッシュに関連するアクションを行いません。このリクエストによって行われた変更は、リクエストが返された後のある時点で表示されます。

どの設定を使用するかの選択

変更が表示されるのを待つ正当な理由がない限り、常に refresh=false(デフォルト設定)を使用してください。最も簡単で迅速な選択は、URLから refresh パラメータを省略することです。

リクエストによって行われた変更をリクエストと同期して表示する必要がある場合は、Elasticsearch にかかる負荷を増やすこと(true)と、応答を待つ時間を長くすること(wait_for)のどちらかを選択しなければなりません。この決定に影響を与えるいくつかのポイントは次のとおりです:

  • インデックスに対して行われる変更が多いほど、wait_fortrue と比較して多くの作業を節約します。インデックスが index.refresh_interval ごとに1回だけ変更される場合、作業は節約されません。
  • true は、後でより効率的なインデックス構造(大きなセグメント)にマージされる必要がある非効率的なインデックス構造(小さなセグメント)を生成します。つまり、true のコストは、小さなセグメントを作成するためのインデックス時、検索時に小さなセグメントを検索するため、マージ時に大きなセグメントを作成するために支払われます。
  • 複数の refresh=wait_for リクエストを連続して開始しないでください。代わりに、それらを refresh=wait_for で単一のバルクリクエストにバッチ処理し、Elasticsearch はすべてを並行して開始し、すべてが完了したときにのみ返します。
  • リフレッシュ間隔が -1 に設定され、自動リフレッシュが無効になっている場合、refresh=wait_for を持つリクエストは、何らかのアクションがリフレッシュを引き起こすまで無期限に待機します。逆に、index.refresh_interval200ms のようなデフォルトよりも短いものに設定すると、refresh=wait_for がより早く戻りますが、依然として非効率的なセグメントが生成されます。
  • refresh=wait_for は、そのリクエストにのみ影響しますが、即座にリフレッシュを強制することによって、refresh=true は他の進行中のリクエストに影響を与えます。一般的に、稼働中のシステムを妨げたくない場合は、refresh=wait_for が小さな変更です。

refresh=wait_for はリフレッシュを強制することができる

もし refresh=wait_for リクエストが、すでにそのシャードでリフレッシュを待っている index.max_refresh_listeners(デフォルトは1000)リクエストがあるときに来た場合、そのリクエストは refreshtrue に設定されているかのように振る舞います:リフレッシュを強制します。これにより、refresh=wait_for リクエストが返されたときに、その変更が検索に表示されるという約束が守られ、ブロックされたリクエストのためのリソース使用が無制限に増加するのを防ぎます。リクエストがリスナースロットが不足してリフレッシュを強制した場合、その応答には "forced_refresh": true が含まれます。

バルクリクエストは、シャードに対して変更を加える回数に関係なく、各シャードで1つのスロットしか占有しません。

これにより、ドキュメントが作成され、インデックスが即座にリフレッシュされて表示されます:

Python

  1. resp = client.index(
  2. index="test",
  3. id="1",
  4. refresh=True,
  5. document={
  6. "test": "test"
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.index(
  11. index="test",
  12. id="2",
  13. refresh=True,
  14. document={
  15. "test": "test"
  16. },
  17. )
  18. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'test',
  3. id: 1,
  4. refresh: true,
  5. body: {
  6. test: 'test'
  7. }
  8. )
  9. puts response
  10. response = client.index(
  11. index: 'test',
  12. id: 2,
  13. refresh: true,
  14. body: {
  15. test: 'test'
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.index({
  2. index: "test",
  3. id: 1,
  4. refresh: "true",
  5. document: {
  6. test: "test",
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.index({
  11. index: "test",
  12. id: 2,
  13. refresh: "true",
  14. document: {
  15. test: "test",
  16. },
  17. });
  18. console.log(response1);

コンソール

  1. PUT /test/_doc/1?refresh
  2. {"test": "test"}
  3. PUT /test/_doc/2?refresh=true
  4. {"test": "test"}

これにより、ドキュメントが作成され、検索のために表示されるようにするためのアクションは行われません:

Python

  1. resp = client.index(
  2. index="test",
  3. id="3",
  4. document={
  5. "test": "test"
  6. },
  7. )
  8. print(resp)
  9. resp1 = client.index(
  10. index="test",
  11. id="4",
  12. refresh=False,
  13. document={
  14. "test": "test"
  15. },
  16. )
  17. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'test',
  3. id: 3,
  4. body: {
  5. test: 'test'
  6. }
  7. )
  8. puts response
  9. response = client.index(
  10. index: 'test',
  11. id: 4,
  12. refresh: false,
  13. body: {
  14. test: 'test'
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.index({
  2. index: "test",
  3. id: 3,
  4. document: {
  5. test: "test",
  6. },
  7. });
  8. console.log(response);
  9. const response1 = await client.index({
  10. index: "test",
  11. id: 4,
  12. refresh: "false",
  13. document: {
  14. test: "test",
  15. },
  16. });
  17. console.log(response1);

コンソール

  1. PUT /test/_doc/3
  2. {"test": "test"}
  3. PUT /test/_doc/4?refresh=false
  4. {"test": "test"}

これにより、ドキュメントが作成され、検索のために表示されるのを待ちます:

Python

  1. resp = client.index(
  2. index="test",
  3. id="4",
  4. refresh="wait_for",
  5. document={
  6. "test": "test"
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.index(
  2. index: 'test',
  3. id: 4,
  4. refresh: 'wait_for',
  5. body: {
  6. test: 'test'
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.index({
  2. index: "test",
  3. id: 4,
  4. refresh: "wait_for",
  5. document: {
  6. test: "test",
  7. },
  8. });
  9. console.log(response);

コンソール

  1. PUT /test/_doc/4?refresh=wait_for
  2. {"test": "test"}