elasticsearch之UpdateByQueryRequest

如果更新一條文檔,而且知道文檔id的前提下可以使用UpdateRequest即可實現,代碼如下:

	/**
	 * 根據文檔id更新
	 * @throws IOException
	 */
	@Test
	public void test() throws IOException {
		UpdateRequest request = new UpdateRequest("sub_bank1031","sub_bank","SvjgP24BndtcmnpzbiuL");
		request.doc("{\"aliasName\":\"中國農業發展銀行林州市支行444\",\"bankType\":\"ADB\",\"bankTypeName\":\"中國農業發展銀行\",\"cityId\":\"410500\",\"cityName\":\"安陽市\",\"createTime\":1515719190000,\"createUser\":\"system\",\"id\":\"000238a326b044e9ae10cfe4298f4c44\",\"isEnabled\":\"1\",\"name\":\"中國農業發展銀行林州市支行\",\"provinceId\":\"410000\",\"provinceName\":\"河南省\",\"unionNumber\":\"203496100010\"}", XContentType.JSON);
		UpdateResponse resp = highLevelClient.update(request, RequestOptions.DEFAULT);
		println(resp.getResult());
	}

但是如果不知道文檔id的情況如果還想使用UpdateRequest更新文檔就需要先使用SearchRequest根據某個條件查詢符合條件的文檔,然後再循環更新文檔即可。

    /**
    **先檢索、再更新文檔
    **/
   	@Test
	public void search() throws IOException{
		SearchRequest searchRequest = new SearchRequest("sub_bank1031");
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.query(QueryBuilders.matchQuery("_id", "SvjgP24BndtcmnpzbiuL"));
		searchSourceBuilder.size(2);
		searchRequest.source(searchSourceBuilder);
		SearchResponse searchResponse = highLevelClient.search(searchRequest, RequestOptions.DEFAULT); 
		SearchHit[] searchHits = searchResponse.getHits().getHits();
	    for(SearchHit s:searchHits){
           String docId = s.getId();
    		UpdateRequest request = new UpdateRequest("sub_bank1031","sub_bank",docId);
		request.doc("{\"aliasName\":\"中國農業發展銀行林州市支行444\",\"bankType\":\"ADB\",\"bankTypeName\":\"中國農業發展銀行\",\"cityId\":\"410500\",\"cityName\":\"安陽市\",\"createTime\":1515719190000,\"createUser\":\"system\",\"id\":\"000238a326b044e9ae10cfe4298f4c44\",\"isEnabled\":\"1\",\"name\":\"中國農業發展銀行林州市支行\",\"provinceId\":\"410000\",\"provinceName\":\"河南省\",\"unionNumber\":\"203496100010\"}", XContentType.JSON);
		UpdateResponse resp = highLevelClient.update(request, RequestOptions.DEFAULT);
		println(resp.getResult());              
	    }
	}

上面操作略顯麻煩,需要多條http請求才能完成,要更新的文檔數量很多時將大大降低系統響應速度,這時候我們可以使用es的UpdateByQueryRequest來實現該功能。

	/**
	 * 通過腳本更新文檔
	 * @throws IOException
	 */
	@Test
	public void updateByQueryRequest() throws IOException {
		UpdateByQueryRequest request = new UpdateByQueryRequest("sub_bank1031");
		request.setDocTypes("sub_bank");
		request.setQuery(new TermQueryBuilder("cityId", "511000"));
		request.setSize(2);
		request.setScript(
			    new Script(
			        ScriptType.INLINE, "painless",
			        "if (ctx._source.bankType == 'BOC') {ctx._source.aliasName='hello'}",
			        Collections.emptyMap()));	
		BulkByScrollResponse resp = highLevelClient.updateByQuery(request, RequestOptions.DEFAULT);
	}

 

PS:

pom文件es相關依賴如下:

         <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.8.0</version>
        </dependency>
        <!-- elasticsearch high level -->    
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>                
                </exclusion>
            </exclusions>
            <version>6.8.0</version>
        </dependency>

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