我是靠谱客的博主 淡淡钢铁侠,这篇文章主要介绍spring data elasticsearch批量更新文档的某个字段,现在分享给大家,希望可以做个参考。

因为使用的是ElasticsearchTemplate模板的方法,故性能上可能会有点差,哪位大神有更好的见解,可以交流一下哈。

java方法如下:

@Autowired
    private ElasticsearchTemplate template;

/**
	 * 批量更新
	 * @param request
	 */
	public void updateQueryByField(Map<String,Map<String,String>> map) {
		List<UpdateQuery> queries = new ArrayList<>();
		Iterable<EsModel> list = esRepository.findAll();
		for(EsModel esmodel : list) {
			UpdateQuery query = new UpdateQuery();
			for (Map.Entry<String, Map<String,String>> entry : map.entrySet()) {
                String field = entry.getKey();
                String oldValue = "";
                String newValue = "";
                Map<String, String> value = (Map<String, String>) entry.getValue();
                	for (Map.Entry<String, String> map2 : value.entrySet()) {
                		oldValue = map2.getKey();
                		newValue = map2.getValue();
                	}
                String idOrCode = "ctx._source."+field;
                UpdateRequest updateRequest = new UpdateRequest();
                updateRequest.script(new Script(ScriptType.INLINE,
    					"painless",
			            "if("+idOrCode+"== "+"'"+oldValue+"'"+"){"+idOrCode+"= "+"'"+newValue+"'"+"}",
			            Collections.emptyMap()));
                query.setUpdateRequest(updateRequest);
                query.setIndexName("item");
    			query.setType("docs");
    			query.setId(esmodel.getId());
    			template.update(query);
    			//queries.add(query);
			}
		}
		//template.bulkUpdate(queries);
	}

注释:EsModel为实体类可自行定义

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
public class EsModel{
	@Id
	private String id;
	@Field(type = FieldType.Text, analyzer = "ik_max_word")
	private String title; //标题
	@Field(type = FieldType.Text, analyzer = "ik_max_word")   //不需要分词类型
	private String keyword;// 关键词
}

测试类如下:

@RequestMapping("updateQueryByField")
	public String updateQueryByField() {
		
		Map<String,Map<String,String>> map = new HashMap<String, Map<String,String>>();//key:字段名称,value:原值和待修改的值
		Map<String,String> mapValue = new HashMap<>();
		mapValue.put("张三1111", "张三111"); //key:原数据,value:待更新的新数据
		map.put("title", mapValue);
		
		Map<String,String> mapValue2 = new HashMap<>();
		mapValue2.put("王五1111", "王五111");
		map.put("keyword", mapValue2);
		
		esUtils.updateQueryByField(map);
		return "success";
	}

如果一次只更新一个字段的值,可以使用以下方法

/**
	 * 批量更新
	 */
	public void updateQueryByField2() {
		List<UpdateQuery> queries = new ArrayList<>();
		Iterable<EsModel> list = esRepository.findAll();
		String idOrCode = "ctx._source."+"title";
		for(EsModel esmodel : list) {
			UpdateQuery query = new UpdateQuery();
			UpdateRequest updateRequest = new UpdateRequest();
			updateRequest.script(new Script(ScriptType.INLINE,
					"painless",
				            "if("+idOrCode+"!= '张三111'){"+idOrCode+"= '张三111'}",
				            Collections.emptyMap()));
			query.setUpdateRequest(updateRequest);
			query.setIndexName("bdms3");
			query.setType("docs");
			query.setId(esmodel.getId());
			queries.add(query);
		}
		template.bulkUpdate(queries);
	}

以上是java方法实现es的批量更新。此外也可以使用kibana语句进行更新:

POST item/_update_by_query
{
  "script": {
    "lang": "painless",
    "inline": "if(ctx._source.title== '张三111'){ctx._source.title= '张三1111'}"
  }
}

期间也查阅了很多资料,可以参考如下博客:

https://blog.csdn.net/wwd0501/article/details/83274930

https://blog.csdn.net/zhou_shaowei/article/details/80079162

https://blog.csdn.net/zhou_shaowei/article/details/80078877

https://blog.csdn.net/pianpiannia/article/details/88944376

https://blog.csdn.net/wangh92/article/details/82854775

最后

以上就是淡淡钢铁侠最近收集整理的关于spring data elasticsearch批量更新文档的某个字段的全部内容,更多相关spring内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部