The refresh parameter
Stack
TheIndex,Update,Delete, andBulk APIs support settingrefresh to control when changes made by this request are made visible to search. These are the allowed values:
- Empty string or
true - Refresh the relevant primary and replica shards (not the whole index) immediately after the operation occurs, so that the updated document appears in search results immediately. This shouldONLY be done after careful thought and verification that it does not lead to poor performance, both from an indexing and a search standpoint.
wait_forWait for the changes made by the request to be made visible by a refresh before replying. This doesn’t force an immediate refresh, rather, it waits for a refresh to happen. Elasticsearch automatically refreshes shards that have changed every
index.refresh_interval.Calling theRefresh API or setting
refreshtotrueon any of the APIs that support it will also cause a refresh, in turn causing already running requests withrefresh=wait_forto return.NoteIn Elastic Stack, the default value for
index.refresh_intervalis1s.
In Elastic Cloud Serverless, the default value forindex.refresh_intervalis5s.
Theindex.refresh_intervalsetting isdynamic.false(the default)- Take no refresh related actions. The changes made by this request will be made visible at some point after the request returns.
Unless you have a good reason to wait for the change to become visible, always userefresh=false (the default setting). The simplest and fastest choice is to omit therefresh parameter from the URL.
If you absolutely must have the changes made by a request visible synchronously with the request, you must choose between putting more load on Elasticsearch (true) and waiting longer for the response (wait_for). Here are a few points that should inform that decision:
- The more changes being made to the index the more work
wait_forsaves compared totrue. In the case that the index is only changed once everyindex.refresh_intervalthen it saves no work. truecreates less efficient indexes constructs (tiny segments) that must later be merged into more efficient index constructs (larger segments). Meaning that the cost oftrueis paid at index time to create the tiny segment, at search time to search the tiny segment, and at merge time to make the larger segments.- Never start multiple
refresh=wait_forrequests in a row. Instead batch them into a single bulk request withrefresh=wait_forand Elasticsearch will start them all in parallel and return only when they have all finished. - If the refresh interval is set to
-1, disabling the automatic refreshes, then requests withrefresh=wait_forwill wait indefinitely until some action causes a refresh. Conversely, settingindex.refresh_intervalto something shorter than the default like200mswill makerefresh=wait_forcome back faster, but it’ll still generate inefficient segments. refresh=wait_foronly affects the request that it is on, but, by forcing a refresh immediately,refresh=truewill affect other ongoing request. In general, if you have a running system you don’t wish to disturb thenrefresh=wait_foris a smaller modification.
If arefresh=wait_for request comes in when there are alreadyindex.max_refresh_listeners (defaults to 1000) requests waiting for a refresh on that shard then that request will behave just as though it hadrefresh set totrue instead: it will force a refresh. This keeps the promise that when arefresh=wait_for request returns that its changes are visible for search while preventing unchecked resource usage for blocked requests. If a request forced a refresh because it ran out of listener slots then its response will contain"forced_refresh": true.
Bulk requests only take up one slot on each shard that they touch no matter how many times they modify the shard.
These will create a document and immediately refresh the index so it is visible:
PUT /test/_doc/1?refresh{"test": "test"}PUT /test/_doc/2?refresh=true{"test": "test"}
These will create a document without doing anything to make it visible for search:
PUT /test/_doc/3{"test": "test"}PUT /test/_doc/4?refresh=false{"test": "test"}
This will create a document and wait for it to become visible for search:
PUT /test/_doc/4?refresh=wait_for{"test": "test"}