Elasticsearch 参考指南(?refresh)
?refresh
索引、更新、删除和批量API支持设置refresh
,以控制何时由此请求做出的更改对搜索可见,这些是允许的值:
空字符串或true
- 在操作发生后立即刷新相关的主碎片和副本碎片(不是整个索引),以便更新后的文档立即出现在搜索结果中,只有经过仔细考虑和核实,从索引和搜索的角度来看,它不会导致性能低下之后,才能这样做。
wait_for
- 在应答之前,等待请求所做的更改被刷新可见,这并不是强制立即刷新,而是等待刷新发生。Elasticsearch会每
index.refresh_interval
(默认值为1秒)自动刷新已经更改的碎片,这个设置是动态的。调用Refresh API或在任何支持它的API上将refresh
设置为true
也会导致刷新,从而导致已经运行的带有refresh=wait_for
的请求返回。
false
(默认)
- 不执行刷新相关操作,此请求所做的更改将在请求返回后的某个时刻变得可见。
选择使用哪个设置
除非你有充分的理由等待更改变为可见,否则总是使用refresh=false
,或者,因为这是默认值,所以将refresh
参数排除在URL之外,这是最简单、最快的选择。
如果你必须使请求所做的更改可见与请求同步,那么你必须在对Elasticsearch增加更多负载(true
)和等待更长时间的响应(wait_for
)之间进行选择,以下几点应该为该决定提供参考:
- 与
true
相比,对索引进行的更改越多,wait_for
节省越多的工作,在每次index.refresh_interval
只更改一次索引的情况下,它不会节省任何工作。 true
创建的索引结构效率较低(小段),稍后必须合并为更高效的索引结构(大段),这意味着true
的代价是在索引时创建小段,在搜索时搜索小段,在合并时制作大段。- 不要在一行中启动多个
refresh=wait_for
请求,相反,将使用refresh=wait_for
的请求批量到单个bulk请求中,Elasticsearch将会并行启动它们,只有当它们全部完成时才返回。 - 如果刷新间隔设置为
-1
,则禁用自动刷新,那么具有refresh=wait_for
的请求将无限期地等待,直到某个操作导致刷新。相反,将index.refresh_interval
设置为比默认值更短的值,比如200ms
,将使refresh=wait_for
返回的速度更快,但仍然会生成效率低下的段。 refresh=wait_for
只影响它所在的请求,但是,通过强制立即刷新,refresh=true
将影响其他正在进行的请求,通常,如果你有一个正在运行的系统,你不希望打扰它,那么refresh=wait_for
是一个较小的修改。
refresh=wait_for
可以强制刷新
如果已经有index.max_refresh_listener
(默认为1000
)请求等待刷新的情况下在那个碎片上出现refresh=wait_for
请求,那么该请求的行为就好像它已经将refresh
设置为true
一样:它将强制刷新。这保证了当refresh=wait_for
请求返回时,它的更改对于搜索是可见的,同时防止对被阻塞的请求使用未检查的资源,如果一个请求因为耗尽了监听器插槽而强制刷新,那么它的响应将包含"forced_refresh": true
。
Bulk请求在每个碎片上只占用一个插槽,不管它们修改碎片多少次。
样例
这将创建一个文档,并立即刷新索引,使其可见:
PUT /test/_doc/1?refresh {"test": "test"} PUT /test/_doc/2?refresh=true {"test": "test"}
这将创建一个文档,而不需要做任何事情使其对于搜索可见:
PUT /test/_doc/3 {"test": "test"} PUT /test/_doc/4?refresh=false {"test": "test"}
这将创建一个文档,并等待它对于搜索成为可见:
PUT /test/_doc/4?refresh=wait_for {"test": "test"}
相关推荐
另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。