【Elasticsearch7.0】文档接口之?refresh接口
简介
像index, update, delete和bulk接口都支持refresh参数,表示这次数据变更什么时候可以被搜索到。
参数值
Empty string或者true
:在操作发生后立即刷新相关的主碎片和副本碎片(而不是整个索引),以便更新后的文档立即出现在搜索结果中。只有在仔细考虑并验证它不会导致性能低下(无论是从索引还是搜索的角度)之后,才应该这样做。
wait_for:发生数据改变之后,不会立即刷新,而是等刷新机制触发刷新,每个分片的自动刷新都是通过index.refresh_interval字段来控制,默认是1秒,这个设置是动态的,在任何支持刷新的API上调用Refresh API或将Refresh设置为true也会导致刷新,从而导致已经运行的带有Refresh =wait_for的请求返回。
false(默认值):不采取刷新相关操作,此请求所做的更改将在请求返回后的某个时刻变得可见。
如何选择设置
除非你有很好的理由来确定立即刷新的好处,如果没有,那么就使用默认值,这是最简单也是最快的选择。
如果你绝对必须使请求所做的更改与请求同步可见,那么你必须在向Elasticsearch添加更多负载和等待响应更长的时间之间进行选择,以下几点应有助于作出这一决定:
1、与true相比,对索引进行的更改越多,wait_for保存的工作就越多。在每个索引只更改一次索引的情况下,refresh_interval则不保存任何工作。
2、true创建效率较低的索引构造(小段),这些构造稍后必须合并为更高效的索引构造(更大的段)。这意味着true的代价是在索引时创建小段,在搜索时搜索小段,在合并时生成更大的段。
3、永远不要在一行中启动多个refresh=wait_for请求。相反,使用refresh=wait_for将它们批处理为单个批量请求,而Elasticsearch将并行地启动它们,只有当它们全部完成时才返回。
4、如果刷新间隔设置为-1,禁用自动刷新,那么refresh=wait_for的请求将无限期等待,直到某个操作导致刷新。相反,设置index.refresh_interval小于默认值(如200ms)将使refresh=wait_for更快地返回,但它仍然会生成效率低下的段。
5、refresh=wait_for只影响正在运行的请求,但是,通过强制立即刷新,refresh=true将影响其他正在进行的请求。通常,如果你有一个正在运行的系统,不希望打扰它,那么refresh=wait_for是一个较好的选择。
强制刷新
可以设置forced_refresh为true来进行强制刷新。
示例
创建文档并且立即可见,如:
curl -XPUT "http://127.0.0.1:9200/test/_doc/1?refresh&pretty" -H "Content-Type:application/json" -d'
{"test": "test"}'
curl -XPUT "http://127.0.0.1:9200/test/_doc/2?refresh=true&pretty" -H "Content-Type:application/json" -d'
{"test": "test"}'
返回值为:
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_version" : 3,
"result" : "updated",
"forced_refresh" : true,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 25,
"_primary_term" : 8
}
创建文档但是不进行刷新操作,如:
curl -XPUT "http://127.0.0.1:9200/test/_doc/3?pretty" -H "Content-Type:application/json" -d'
{"test": "test"}'
curl -XPUT "http://127.0.0.1:9200/test/_doc/4?refresh=false&pretty" -H "Content-Type:application/json" -d'
{"test": "test"}'
返回值为:
{
"_index" : "test",
"_type" : "_doc",
"_id" : "4",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 27,
"_primary_term" : 8
}
创建一个文档,并等待他对搜索可见,如:
curl -XPUT "http://127.0.0.1:9200/test/_doc/4?refresh=wait_for&pretty" -H "Content-Type:application/json" -d'
{"test": "test"}'
返回值为:
{
"_index" : "test",
"_type" : "_doc",
"_id" : "4",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 28,
"_primary_term" : 8
}
也可以关注我的公众号:程序之声
关注公众号,领取更多资源。