ElasticSearch API for JAVA 学习笔记

原创 2016年08月31日 10:10:47

本篇学习笔记来源于ES官方网站的指导文档:ES JAVA API

Client

Client是一个类,通过这个类可以实现对ES集群的各种操作:Index, Get, Delete , Search,以及对ES集群的管理任务。
Client的构造需要基于TransportClient

TransportClient

TransportClient可以远程连接ES集群,通过一个传输模块,但是它不真正的连接到集群,只是获取集群的一个或多个初始传输地址,在每次请求动作时,才真正连接到ES集群。

Settings

Settings类主要是在启动Client之前,配置一些属性参数,主要配置集群名称cluster.name,还有其他参数:
client.transport.sniff  是否为传输client添加嗅探功能
client.transport.ignore_cluster_name 设为true,忽略连接节点的集群名称验证
client.transport.ping_timeout 设置ping节点时的时间限,默认5s
client.transport.nodes_sampler_interval 设置sample/ping nodes listed 间隔时间,默认5s

		//通过Settings类设置属性参数
		Settings settings = Settings.settingsBuilder().put("cluster.name","index-name").build();
		
		//启动Client
		Client client = TransportClient.builder().settings(settings).build().
				addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.xxx.xxx"),9300));
		
		//如果不需要设置参数,直接如下
		/*Client client = TransportClient.builder().build().
				addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.xxx.xxx"),9300));*/
		
		//关闭Clinet
		client.close();

Document API

主要分为以下类:Index API , Get API , Delete API , Update API, Multi Get API, Bulk API

es中的增删改查

Index API可以索引一个典型的JSON文档到指定的索引中,并且可以使它可以检索。

产生JSON

JSON产生可以有以下几种方式:
手动拼接一个JSON字符串
使用Map
使用第三方库,比如Jackson
使用内置的XContentFactory.jsonBuilder()
每种类型都会转换为byte[],因此如果对象已经是这种形式,可以直接使用,jsonBuilder是一个高度优化了的JSON产生器,它直接构造byte[]
通过下边的代码讲解四种方法:index-api, get-api, delete-api, update-api
/**
	 * es-api的方法学习:
	 * 1.prepareIndex方法:索引数据到ElasticSearch
	 * 2.prepareGet方法:获取信息
	 * 3.prepareDelete方法:删除信息
	 * 4.update方法:更新信息
	 *   4.1 upsert:在使用update方法时:
	 *       a:针对文档不存在的情况时,做出index数据的操作,update无效;
	 *        b:如果文档存在,那么index数据操作无效,update有效;
	 */
	public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
		//通过Settings类设置属性参数  
		Settings settings = Settings.settingsBuilder().put("cluster.name","myApp").build();  
		  
		//启动Client  
		Client client = null;
		try {
			client = TransportClient.builder().settings(settings).build().  
			        addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("101.200.124.27"),9300));
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}  
		//执行操作
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		XContentBuilder jsonBuilder = XContentFactory.jsonBuilder()
				.startObject()
				.field("user","yuchen")
				.field("interest","reading book")
				.field("insert_time",df.format(new Date()))
				.endObject();
		//1.prepareIndex方法:索引数据到ElasticSearch
		IndexResponse response = client.prepareIndex("index-test","weibo","4")
			.setSource(jsonBuilder)
			.get();
		
		String _index = response.getIndex();
		String _type = response.getType();
		String _id = response.getId();
		long _version = response.getVersion();
		boolean created = response.isCreated();
		System.out.println(_index+" "+_type+" "+_id+" "+_version+" "+created);
		
		//2.prepareGet方法:获取信息
		GetResponse getResponse = client.prepareGet("index-test","weibo","1").get();
		System.out.println(getResponse.getSourceAsString());
		
		//3.prepareDelete方法:删除信息
		DeleteResponse deleteResponse = client.prepareDelete("index-test","weibo","4").get();
		System.out.println(deleteResponse.isFound());
		
		//4.update方法:更新信息
		UpdateRequest updateRequest = new UpdateRequest();
		updateRequest.index("index-test");
		updateRequest.type("weibo");
		updateRequest.id("1");
		updateRequest.doc(XContentFactory.jsonBuilder().startObject().field("interest","music").endObject());
		UpdateResponse updateResponse = client.update(updateRequest).get();
		System.out.println(updateResponse.isCreated());
		//update方法: 可以为已有的文档添加新的字段
		UpdateResponse updateResponse2 = client.prepareUpdate("index-test", "weibo", "1")
			.setDoc(XContentFactory.jsonBuilder()
				.startObject()
				.field("interest2","reading")
				.endObject()).get();
		System.out.println(updateResponse2.isCreated());
		//4.1 upsert:在使用update方法时,a:针对文档不存在的情况时,做出index数据的操作,update无效;
		//						  b:如果文档存在,那么index数据操作无效,update有效;
		//先构建一个IndexRequest
		IndexRequest indexRequest = new IndexRequest("index-test","weibo","14");
		indexRequest.source(XContentFactory.jsonBuilder()
				.startObject()
				.field("user","yuchen2")
				.field("interest","eating")
				.field("insert_time",df.format(new Date()))
				.endObject());
		//再构建一个UpdateRequest,并用IndexRequest关联
		UpdateRequest updateRequest3 = new UpdateRequest("index-test","weibo","14");
		updateRequest3.doc(XContentFactory.jsonBuilder()
				.startObject()
				.field("interest2","love")
				.endObject()
				).upsert(indexRequest);
		client.update(updateRequest3).get();
		
		if(client != null){
			client.close();  
		}
	}

批量操作

Multi Get Api 和 Bulk Api可进行批量的增删改查
使用Multi Get Api 批量获取:
		//1. Muti-get Api
		//可以指定单个id,也在index,type下指定一个id-list;也可以指定别的index/type
		MultiGetResponse multiGetResponse = client.prepareMultiGet()
				.add("index-test","weibo","1")//指定单个id
				.add("index-test","weibo","11","13","14")//指定一个id-list
				.add("index-other","news","1","3").get();//指定别的index/type
		for(MultiGetItemResponse item:multiGetResponse){
			GetResponse response = item.getResponse();
			System.out.println(response.getSourceAsString());
		}
Bulk Api批量增加:
		//2.Bulk Api:可以进行批量index和批量删除操作
		//2.1批量增加
		BulkRequestBuilder bulkRequest = client.prepareBulk();
		bulkRequest.add(client.prepareIndex("index-test", "weibo", "20")
	        .setSource(XContentFactory.jsonBuilder()
	                .startObject()
	                    .field("user", "yuchen20")
	                    .field("postDate", new Date())
	                    .field("message", "trying out Elasticsearch")
	                .endObject()
	              )
          );
		bulkRequest.add(client.prepareIndex("index-test", "weibo", "21")
		        .setSource(XContentFactory.jsonBuilder()
		                .startObject()
		                    .field("user", "yuchen21")
		                    .field("postDate", new Date())
		                    .field("message", "trying out Elasticsearch")
		                .endObject()
		              )
	          );
		
		BulkResponse bulkResponse = bulkRequest.get();
		if(bulkResponse.hasFailures()){
			//...
		}
Bulk Api批量删除:
		//2.2批量删除
		BulkRequestBuilder bulkRequest = client.prepareBulk();
		bulkRequest.add(client.prepareDelete("index-test", "weibo", "20")
          );
		bulkRequest.add(client.prepareDelete("index-test", "weibo", "21")
	          );
		
		BulkResponse bulkResponse = bulkRequest.get();
		if(bulkResponse.hasFailures()){
			System.out.println("bulk error:"+bulkResponse.buildFailureMessage());
		}
Bulk Api 批量更新
		//2.3批量更新
		BulkRequestBuilder bulkRequest = client.prepareBulk();
		bulkRequest.add(client.prepareUpdate("index-test", "weibo", "11").setDoc(XContentFactory
				.jsonBuilder().startObject()
				.field("country","China")//新添加字段
				.endObject()
				)
          );
		bulkRequest.add(client.prepareUpdate("index-test", "weibo", "13").setDoc(XContentFactory
				.jsonBuilder().startObject()
				.field("user","yuchen13")//更新字段
				.endObject()
				)
	          );
		
		BulkResponse bulkResponse = bulkRequest.get();
		if(bulkResponse.hasFailures()){
			System.out.println("bulk error:"+bulkResponse.buildFailureMessage());
		}

BulkProcessor设置批量请求的属性

		//BulkProcessor
		BulkProcessor bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() {
			@Override
			public void beforeBulk(long arg0, BulkRequest arg1) {
				//批量执行前做的事情
				System.out.println("bulk api action starting...");
			}
			@Override
			public void afterBulk(long arg0, BulkRequest arg1, Throwable arg2) {
				System.out.println("exception:bukl api action ending...:"+arg2.getMessage());
			}
			@Override
			public void afterBulk(long arg0, BulkRequest arg1, BulkResponse arg2) {
				//正常执行完毕后...
				System.out.println("normal:bukl api action ending...");
			}
		})
		//设置多种条件,对批量操作进行限制,达到限制中的任何一种触发请求的批量提交
		.setBulkActions(1000)//设置批量操作一次性执行的action个数,根据请求个数批量提交
		//.setBulkSize(new ByteSizeValue(1,ByteSizeUnit.KB))//设置批量提交请求的大小允许的最大值
		//.setFlushInterval(TimeValue.timeValueMillis(100))//根据时间周期批量提交请求
		//.setConcurrentRequests(1)//设置允许并发请求的数量
		//设置请求失败时的补偿措施,重复请求3次
		//.setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))
		.build();
		for(int i =0;i<100000;i++){
			bulkProcessor.add(new IndexRequest("index-test","weibo2",""+i).source(
					XContentFactory
					.jsonBuilder()
					.startObject()
					.field("name","yuchen"+i)
					.field("interest","love"+i)
					.endObject()));
		}
		bulkProcessor.awaitClose(5, TimeUnit.MINUTES);//释放bulkProcessor资源
		System.out.println("load succeed!");

默认的参数:
  • sets bulkActions to 1000
  • sets bulkSize to 5mb
  • does not set flushInterval
  • sets concurrentRequests to 1
  • sets backoffPolicy to an exponential backoff with 8 retries and a start delay of 50ms. The total wait time is roughly 5.1 seconds.








elasticsearch——Java API的使用

前一篇有关ES的文章介绍了使用Rest方式调用ES的聚合API。Rest API使用了HTTP协议,按理来说,可以直接使用类似HttpClient的工具直接调用Rest API。虽然笔者并没有尝试过,...
  • wanbf123
  • wanbf123
  • 2017年09月25日 19:13
  • 942

ElasticSearch Java API 中文文档

  • 2018年01月04日 10:48
  • 786KB
  • 下载

[ElasticSearch]使用 java API 进行CRUD操作

本篇文章将介绍怎样使用 java 对 ElasticSearch 进行操作。 首先需要建立一个 maven 项目,这里不再赘述。 1.在maven 的 pom.xml文件中需要引入以下几个 jar...
  • lionel_fengj
  • lionel_fengj
  • 2017年10月25日 19:54
  • 383

Elasticsearch Java API总汇

三、Elasticsearch Java API 3.1 集群的连接 3.1.1 作为Elasticsearch节点 代码:          import static org.elasti...
  • changong28
  • changong28
  • 2014年08月08日 21:50
  • 23199

elasticsearch java api的基本使用

package com.fk.elasticsearch; import java.util.ArrayList; import java.util.List; import java.util.U...
  • fk5431
  • fk5431
  • 2016年05月27日 14:32
  • 806

elasticsearch5 官方文档整理。。。。中

Document API经过实践证明,ES不适合做数据库用,尤其数据展示要求严格的。在项目中索引名尽量使用别名:即使你认为当前的索引设计是完美的,将来你也会发现有一些部分需要被改变,而那个时候你的索引...
  • yixiaoqi2010
  • yixiaoqi2010
  • 2017年07月26日 13:15
  • 431

Elasticsearch Java API总汇

3.1 集群的连接 3.1.1 作为Elasticsearch节点 import static org.elasticsearch.node.NodeBuilder.nodeBuilder; im...
  • sun_it_csdn
  • sun_it_csdn
  • 2017年01月25日 10:51
  • 308

Elasticsearch Java API 的使用(12)—度量聚合之一

度量聚合从文档中提取出来的值并进行计算。这些值通常从文档中的字段(使用数据字段)中提取出来,单也可以使用脚本进行计算。 数字型度量聚合是一种特殊类型的度量聚合,输出数字型的值。聚合输出一个数字指标(...
  • zx711166
  • zx711166
  • 2017年11月22日 14:38
  • 313

[搜索]ElasticSearch Java Api(一) -创建索引

ElasticSearch JAVA API官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/jav...
  • napoay
  • napoay
  • 2016年06月19日 23:25
  • 64675

[ElasticSearch]Java API 之 索引文档 (Index API)

Index API 允许我们存储一个JSON格式的文档,使数据可以被搜索。文档通过index、type、id唯一确定。我们可以自己提供一个id,或者也使用Index API 为我们自动生成一个。 这...
  • SunnyYoona
  • SunnyYoona
  • 2016年10月13日 13:25
  • 4903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ElasticSearch API for JAVA 学习笔记
举报原因:
原因补充:

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