elasticsearch實戰---java實現修改數據當即可見

0.背景

後臺管理系統中,當進行部分修改操做後,會當即跳轉列表頁面,此時列表展現的仍爲es的舊數據。修改的es的數據沒有當即展現,可是當再次刷新頁面後,數據才爲最新的數據。java

衆所周知,es不是一個實時的搜索引擎,當數據從寫入到可見之間有1秒的間隔時間。所以,在此時間間隔內的查詢操做,都是否是最新的數據。bash

1.解決

java high level client中,爲indexinsertupdatebulk 提供了setRefreshPolicy方法,用於設置數據更改後的刷新策略。性能

主要是三個參數IMMEDIATENONEWAIT_UNTILthis

NONE:搜索引擎

Don’t refresh after this request. The default.
這是默認的一種方式,調用request修改之後,並不進行強制刷新,刷新的時間間隔爲refresh_interval設置的參數。
複製代碼
// 1.
request.setRefreshPolicy(WriteRequest.RefreshPolicy.NONE);
// 2.
request.setRefreshPolicy("false");
複製代碼

IMMEDIATEspa

強制刷新相關的主分片和副分片(而不是整個索引),使更新的分片狀態變爲可搜索。
在使用以前,必定要仔細考慮使用該參數會不會致使性能不佳。
強制刷新做爲請求的一部分,這種方式並不適用於索引和查詢高吞吐量的場景,
可是做爲流量小時提供一致性的視圖的確是很使用的。
複製代碼
// 1.
request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
// 2.
request.setRefreshPolicy("true");
複製代碼

WAIT_UNTIL:code

在返回請求結果以前,會等待刷新請求所作的更改。並非強制當即刷新,而是等待刷新發生
。Elasticsearch會自動刷新已更改每一個index.refresh_interval的分片,默認爲一秒。該設置是動態的。
請求持續爲打開狀態,直到修改的內容變爲可搜索爲止。此刷新策略與高索引和搜索吞吐量兼容,但它會致使請求等待回覆,直到刷新發生
複製代碼
設置方式有如下兩種。
// 1.
request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
// 2.
request.setRefreshPolicy("wait_for");
複製代碼
相關文章
相關標籤/搜索