关闭

elasticsearch 学习博客系列<五> ES 中 index-doc 的 更新(java)

标签: elasticsearchjava
87人阅读 评论(1) 收藏 举报
分类:

这一篇我们说一下Java 操作ES 如何进行数据doc更新,同样可分为 单个更新 与 批量更新,和删除的 步骤一样 你首先要进行定位操作 即 获取 docID,然后 再进行操作

定位:indexName+typeName+docId


单个更新:


1通过增加进行覆盖

/**
	 * 更新 单条 -数据 通过id
	 * @param obj
	 */
	public void updateInfo(OwnUsedAsset obj){
		if(obj == null) return;
		boolean exist = EsClientUtil.isExistIndex(name);
		if(exist){
			ESClient client = EsClientUtil.getDefaultDelegateClient();
			QueryBuilder qb = QueryBuilders.termQuery("id", obj.getId());
			SearchResponse respose = client.prepareSearch(name)
			.setQuery(qb)
			.setSize(1)
			.execute().actionGet();
			
			SearchHit[] hits = respose.getHits().getHits();
			if(hits.length > 0){
				
				// 先获取文档ID
				String docId = hits[0].getId();
				
				// 对数据进行更新
				if(obj.getState()!= 2){
					
					obj.setState(1);
				}
				obj.setUpdateTime(System.currentTimeMillis());
				String data = JsonUtil.toJson(obj);
				// 进行操作
				client.prepareIndex(name, name)
					.setId(docId)
					.setSource(data)
					.execute()
					.actionGet();
				
				
			}
		}
	}
这种方式 是 对整个文档进行覆盖更新,那么 如果只改某个字段 该如何操作呢?

2. 更新 文档中 某字段

/**
	 * HashMap<String, Object> editMap = new HashMap<>();
			editMap.put("state", 3);
			editMap.put("actionTime", 666666);
	 * setDoc("actionTime", 10000)
	 * 每次只能改一个,后面的会覆盖前面的
	 * @param docId
	 */
	public void updateDataInField(String docId ,Map editMap){
		boolean flag = EsClientUtil.isExistIndex(name);
		if(flag){
			ESClient client = EsClientUtil.getDefaultDelegateClient();
			
			client.prepareUpdate(name, name, docId)
				.setDoc(editMap)
				.execute().actionGet();
		}
		
	}


批量 更新:

/**
	 * 批量更新 信息
	 * @param downLineID
	 */
	public void bulkUpdateState(Set<String> downLineID ,Map editMap){
		if(downLineID.size() == 0) return;
		boolean flag = EsClientUtil.isExistIndex(name);
		if(flag){
			ESClient client = EsClientUtil.getDefaultDelegateClient();
			BulkRequestBuilder prepareBulk = client.prepareBulk();
			
			for (String docId : downLineID) {
				prepareBulk.add(client.prepareUpdate(name, name, docId).setDoc(editMap));
			}
		
			prepareBulk.execute().actionGet();
			
		}
	}
	/**
	 * 批量更新 信息
	 * @param downLineID
	 */
	public void bulkUpdateState(Map<String,String> downLineID ,Map editMap){
		if(downLineID.size() == 0) return;
		boolean flag = EsClientUtil.isExistIndex(name);
		if(flag){
			ESClient client = EsClientUtil.getDefaultDelegateClient();
			BulkRequestBuilder prepareBulk = client.prepareBulk();
			Set<String> entrySet = downLineID.keySet();
			for (String docId : entrySet) {
				editMap.put("remark", downLineID.get(docId));
				prepareBulk.add(client.prepareUpdate(name, name, docId).setDoc(editMap));
			}
			prepareBulk.execute().actionGet();
		}
		
	}


一般来说这些 也就够了,如果数据量 很大,则注意分段!


0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6977次
    • 积分:710
    • 等级:
    • 排名:千里之外
    • 原创:62篇
    • 转载:18篇
    • 译文:0篇
    • 评论:4条