ElasticSearch update_by_query

項目中需要定時對ElasticSearch的某些數據進行更新,數據量十幾萬,採用RestClient更新,在沒有設置超時的情況下,報錯如下:java.io.IOException: listener timeout after waiting for [30000] ms

一般通常的做法都是修改超時時間設置:

restClient = RestClient.builder(
        new HttpHost(GSConstants.P_ES_HOST, GSConstants.P_ES_PORT, "http"))
        .setMaxRetryTimeoutMillis(TIMEOUT)
        .setHttpClientConfigCallback(new HttpClientConfigCallback(){
			@Override
			public HttpAsyncClientBuilder customizeHttpClient(
				HttpAsyncClientBuilder httpClientBuilder) {
				RequestConfig.Builder requestConfigBuilder = RequestConfig.custom()
				               .setConnectTimeout(5*60*1000)//超時時間5分鐘
				               .setSocketTimeout(5*60*1000)//這就是Socket超時時間設置
				               .setConnectionRequestTimeout(DEFAULT_CONNECTION_REQUEST_TIMEOUT_MILLIS);
				httpClientBuilder.setDefaultRequestConfig(requestConfigBuilder.build());
				return httpClientBuilder; 
			}
}).build();

update_by_query 顧名思義,通過查詢更新,既先query出符合條件的內容再進行update操作,新增字段,修改字段值都可以滿足,這個批量修改更符合我們的需求。

updateByQuery的調用首先獲取索引的快照,對使用內部版本控制的任何文檔進行索引。當版本匹配時,updateByQuery會更新文檔並增加版本號。當一個文檔在快照的時間和索引請求過程的時間之間發生變化時,就會發生版本衝突。爲了防止版本衝突導致updateByQuery中止,設置終止衝突(false)。

所有更新和查詢失敗都會導致updateByQuery中止,任何成功的更新都是保留的,不會回滾。當第一個故障導致中止時,響應包含失敗的批量請求所產生的所有故障。

UpdateByQueryRequestBuilder updateByQuery = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);
updateByQuery.source("source_index")
    .filter(QueryBuilders.termQuery("name", "alex"))
    .size(1000)
    .script(new Script(ScriptType.INLINE, "ctx._source.awesome = 'absolutely'", "painless", Collections.emptyMap()));
BulkByScrollResponse response = updateByQuery.get();

您可以使用這個訪問來改變默認的滾動大小,或者對匹配文檔的請求進行修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章