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

原创 2017年06月02日 00:14:59

这一篇我们说一下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();
		}
		
	}


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


版权声明:本文为博主原创文章,未经博主允许不得转载。

elasticsearch 学习博客系列<四> ES 中 index-doc 的 删除(java)

这一篇 我们讲解一下 Java 常用的 删除ES文档 doc 的方法,也是 分为 单个 删除 和 批量删除 删除的时候要进行定位,indexName + typeName + docId 进行 唯一...

es用restful api 操作数据

1.在 es 中存储数据  1.1 put http://localhost:9200/blog/article/1 {"title":"titlename2","cluster_name...

ElasticSearch Java Api(三) -更新索引库

官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-update.html一、Up...
  • napoay
  • napoay
  • 2016年06月27日 17:12
  • 13875

Spark写ES的遇到的坑

由于项目需要,最近搞Spark Streaming做数据分析,并最终将分析完的数据写入ElasticSearch。我们项目使用的是Spark 2.1.0,而我们公司的ElasticSearch版本使用...

矩阵分解模型(1):ALS学习算法

一、矩阵分解模型。 用户对物品的打分行为可以表示成一个评分矩阵A(m*n),表示m个用户对n各物品的打分情况。如下图所示: 其中,A(i,j)表示用户user i对物品item j的打分。...

elasticsearch 学习博客系列<二> ES 中 index 设置 Mapping(表结构)

通过上一篇 我们了解到ES中的一些概念,回顾一下: 几个基本名词 index: es里的index相当于一个数据库。  type: 相当于数据库里的一个表。  id: 唯一,相当于主键。  n...

Elasticsearch笔记五之java操作es

java操作es集群代码
  • ty4315
  • ty4315
  • 2016年09月04日 19:50
  • 26064

罗大柚OpenGL ES教程系列LessonTwo(Part 3):采用VAO和index,绘制一个Cube

同样的, LessonTwo的第三部分我们采用了VAO,但是我们觉得在part 2中那中为创建一个Cube而重复大量顶点数据的方式并不完美,于是我们很自然的想到了用index,part 3就是采用了V...

ElasticSearch5.x—条件查询获取所有doc Java实现

在Elasticsearch老版本中做数据遍历一般使用Scroll-Scan。Scroll是先做一次初始化搜索把所有符合搜索条件的结果缓存起来生成一个快照,然后持续地、批量地从快照里拉取数据直到没有数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch 学习博客系列<五> ES 中 index-doc 的 更新(java)
举报原因:
原因补充:

(最多只允许输入30个字)