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的童鞋,经常搞不明白ES的各个概念的含义。尤其对“索引”二字更是与关系型数据库混淆的不行。本文通过对比关系型数据库,将ES中常见的增、删、改、查操作进行图文呈现。能加深你对ES的理...
  • wojiushiwo987
  • wojiushiwo987
  • 2016年07月17日 13:30
  • 44191

java 操作ES 增删改查总结

本实例框架采用 nutz+ES,如果 您查找相关知识,请注意过滤不相干的信息 controller 层: package com.test.ownasset.controller; impor...
  • qq_29631809
  • qq_29631809
  • 2017年05月15日 17:23
  • 2870

ElasticSearch-Java 基础教程-----java ES 操作手册(一)

创建连接public static Client init() { if (client == null || ((TransportClient)...
  • sun123_123
  • sun123_123
  • 2017年03月29日 09:42
  • 2058

一篇还不错的es的搜索方面的整理

elasticsearch的查询有两部分组成:query and filter。 两者的主要区别在于:filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。 先...
  • xinguimeng
  • xinguimeng
  • 2016年06月13日 14:54
  • 1750

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
  • 15785

分布式搜索elasticsearch 索引文档的增删改查 入门

1、RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口。 RESTful接口URL的格式: http://localhost:...
  • gdutliuyun827
  • gdutliuyun827
  • 2014年10月14日 15:47
  • 39605

ElasticSearch批量更新索引的优化

1. 多线程程序插入可以根据服务器情况开启多个线程index,速度可以提高n倍, n>=2 2. 取消replias如果有多台机器,可以以每台设置n个shards的方式,根据业务情况,可以考虑取消re...
  • lazythinker
  • lazythinker
  • 2017年03月08日 14:02
  • 1971

es 语句

{   "sort": {     "id": {       "order": "desc"     }   },   "query": {     "filtered": {       "fil...
  • u014017121
  • u014017121
  • 2016年10月09日 18:48
  • 271

ElasticSearch的update_by_query方法

Es的update_by_query方法会首先执行脚本中的query方法,获取到数据之后,执行update方法,之前在python的客户端中就看到了这个借口,现在用了一下,效果不错 update...
  • yyd19921214
  • yyd19921214
  • 2017年01月11日 10:33
  • 3502

elasticsearch UpdateByQuery的使用

上一篇发了解决elasticsearch UpdateByQuery的问题,后来遇到好多小伙伴问我,为什么他使用不了UpdateByQuery,遂科普下。 在于你可能没有引入reindex包: ...
  • jacklin929
  • jacklin929
  • 2017年08月29日 16:10
  • 1607
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch 学习博客系列<五> ES 中 index-doc 的 更新(java)
举报原因:
原因补充:

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