?refresh
このインデックス、更新、削除、およびバルク API は、refresh
を設定して、このリクエストによって行われた変更が検索に表示されるタイミングを制御することをサポートしています。許可されている値は次のとおりです:
- 空の文字列または
true
- 操作が発生した直後に関連するプライマリおよびレプリカシャード(インデックス全体ではなく)を即座にリフレッシュし、更新されたドキュメントが検索結果にすぐに表示されるようにします。これは、インデックス作成と検索の両方の観点からパフォーマンスが低下しないことを慎重に考慮し、検証した後にのみ行うべきです。
wait_for
- 応答する前に、リクエストによって行われた変更がリフレッシュによって表示されるのを待ちます。これは即時のリフレッシュを強制するものではなく、リフレッシュが発生するのを待ちます。Elasticsearch は、
index.refresh_interval
ごとに変更されたシャードを自動的にリフレッシュします。デフォルトは1秒です。その設定は動的です。リフレッシュ API を呼び出すか、refresh
をtrue
に設定すると、リフレッシュが発生し、refresh=wait_for
を持つ既存のリクエストが返されます。 false
(デフォルト)- リフレッシュに関連するアクションを行いません。このリクエストによって行われた変更は、リクエストが返された後のある時点で表示されます。
どの設定を使用するかの選択
変更が表示されるのを待つ正当な理由がない限り、常に refresh=false
(デフォルト設定)を使用してください。最も簡単で迅速な選択は、URLから refresh
パラメータを省略することです。
リクエストによって行われた変更をリクエストと同期して表示する必要がある場合は、Elasticsearch にかかる負荷を増やすこと(true
)と、応答を待つ時間を長くすること(wait_for
)のどちらかを選択しなければなりません。この決定に影響を与えるいくつかのポイントは次のとおりです:
- インデックスに対して行われる変更が多いほど、
wait_for
はtrue
と比較して多くの作業を節約します。インデックスがindex.refresh_interval
ごとに1回だけ変更される場合、作業は節約されません。 true
は、後でより効率的なインデックス構造(大きなセグメント)にマージされる必要がある非効率的なインデックス構造(小さなセグメント)を生成します。つまり、true
のコストは、小さなセグメントを作成するためのインデックス時、検索時に小さなセグメントを検索するため、マージ時に大きなセグメントを作成するために支払われます。- 複数の
refresh=wait_for
リクエストを連続して開始しないでください。代わりに、それらをrefresh=wait_for
で単一のバルクリクエストにバッチ処理し、Elasticsearch はすべてを並行して開始し、すべてが完了したときにのみ返します。 - リフレッシュ間隔が
-1
に設定され、自動リフレッシュが無効になっている場合、refresh=wait_for
を持つリクエストは、何らかのアクションがリフレッシュを引き起こすまで無期限に待機します。逆に、index.refresh_interval
を200ms
のようなデフォルトよりも短いものに設定すると、refresh=wait_for
がより早く戻りますが、依然として非効率的なセグメントが生成されます。 refresh=wait_for
は、そのリクエストにのみ影響しますが、即座にリフレッシュを強制することによって、refresh=true
は他の進行中のリクエストに影響を与えます。一般的に、稼働中のシステムを妨げたくない場合は、refresh=wait_for
が小さな変更です。
refresh=wait_for はリフレッシュを強制することができる
もし refresh=wait_for
リクエストが、すでにそのシャードでリフレッシュを待っている index.max_refresh_listeners
(デフォルトは1000)リクエストがあるときに来た場合、そのリクエストは refresh
が true
に設定されているかのように振る舞います:リフレッシュを強制します。これにより、refresh=wait_for
リクエストが返されたときに、その変更が検索に表示されるという約束が守られ、ブロックされたリクエストのためのリソース使用が無制限に増加するのを防ぎます。リクエストがリスナースロットが不足してリフレッシュを強制した場合、その応答には "forced_refresh": true
が含まれます。
バルクリクエストは、シャードに対して変更を加える回数に関係なく、各シャードで1つのスロットしか占有しません。
例
これにより、ドキュメントが作成され、インデックスが即座にリフレッシュされて表示されます:
Python
resp = client.index(
index="test",
id="1",
refresh=True,
document={
"test": "test"
},
)
print(resp)
resp1 = client.index(
index="test",
id="2",
refresh=True,
document={
"test": "test"
},
)
print(resp1)
Ruby
response = client.index(
index: 'test',
id: 1,
refresh: true,
body: {
test: 'test'
}
)
puts response
response = client.index(
index: 'test',
id: 2,
refresh: true,
body: {
test: 'test'
}
)
puts response
Js
const response = await client.index({
index: "test",
id: 1,
refresh: "true",
document: {
test: "test",
},
});
console.log(response);
const response1 = await client.index({
index: "test",
id: 2,
refresh: "true",
document: {
test: "test",
},
});
console.log(response1);
コンソール
PUT /test/_doc/1?refresh
{"test": "test"}
PUT /test/_doc/2?refresh=true
{"test": "test"}
これにより、ドキュメントが作成され、検索のために表示されるようにするためのアクションは行われません:
Python
resp = client.index(
index="test",
id="3",
document={
"test": "test"
},
)
print(resp)
resp1 = client.index(
index="test",
id="4",
refresh=False,
document={
"test": "test"
},
)
print(resp1)
Ruby
response = client.index(
index: 'test',
id: 3,
body: {
test: 'test'
}
)
puts response
response = client.index(
index: 'test',
id: 4,
refresh: false,
body: {
test: 'test'
}
)
puts response
Js
const response = await client.index({
index: "test",
id: 3,
document: {
test: "test",
},
});
console.log(response);
const response1 = await client.index({
index: "test",
id: 4,
refresh: "false",
document: {
test: "test",
},
});
console.log(response1);
コンソール
PUT /test/_doc/3
{"test": "test"}
PUT /test/_doc/4?refresh=false
{"test": "test"}
これにより、ドキュメントが作成され、検索のために表示されるのを待ちます:
Python
resp = client.index(
index="test",
id="4",
refresh="wait_for",
document={
"test": "test"
},
)
print(resp)
Ruby
response = client.index(
index: 'test',
id: 4,
refresh: 'wait_for',
body: {
test: 'test'
}
)
puts response
Js
const response = await client.index({
index: "test",
id: 4,
refresh: "wait_for",
document: {
test: "test",
},
});
console.log(response);
コンソール
PUT /test/_doc/4?refresh=wait_for
{"test": "test"}