前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >elasticsearch之UpdateByQueryRequest

elasticsearch之UpdateByQueryRequest

作者头像
johnhuster的分享
发布2022-03-29 14:43:31
1.7K0
发布2022-03-29 14:43:31
举报
文章被收录于专栏:johnhuster

如果更新一条文档,而且知道文档id的前提下可以使用UpdateRequest即可实现,代码如下:

代码语言:javascript
复制
	/**
	 * 根据文档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根据某个条件查询符合条件的文档,然后再循环更新文档即可。

代码语言:javascript
复制
    /**
    **先检索、再更新文档
    **/
   	@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来实现该功能。

代码语言:javascript
复制
	/**
	 * 通过脚本更新文档
	 * @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相关依赖如下:

代码语言:javascript
复制
         <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>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档