ElasticSearch API for JAVA 学习笔记

本篇学习笔记来源于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

[java]  view plain  copy
  1. //通过Settings类设置属性参数  
  2. Settings settings = Settings.settingsBuilder().put("cluster.name","index-name").build();  
  3.   
  4. //启动Client  
  5. Client client = TransportClient.builder().settings(settings).build().  
  6.         addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.xxx.xxx"),9300));  
  7.   
  8. //如果不需要设置参数,直接如下  
  9. /*Client client = TransportClient.builder().build(). 
  10.         addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.xxx.xxx"),9300));*/  
  11.   
  12. //关闭Clinet  
  13. 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
[java]  view plain  copy
  1. /** 
  2.      * es-api的方法学习: 
  3.      * 1.prepareIndex方法:索引数据到ElasticSearch 
  4.      * 2.prepareGet方法:获取信息 
  5.      * 3.prepareDelete方法:删除信息 
  6.      * 4.update方法:更新信息 
  7.      *   4.1 upsert:在使用update方法时: 
  8.      *       a:针对文档不存在的情况时,做出index数据的操作,update无效; 
  9.      *        b:如果文档存在,那么index数据操作无效,update有效; 
  10.      */  
  11.     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {  
  12.         //通过Settings类设置属性参数    
  13.         Settings settings = Settings.settingsBuilder().put("cluster.name","myApp").build();    
  14.             
  15.         //启动Client    
  16.         Client client = null;  
  17.         try {  
  18.             client = TransportClient.builder().settings(settings).build().    
  19.                     addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("101.200.124.27"),9300));  
  20.         } catch (UnknownHostException e) {  
  21.             e.printStackTrace();  
  22.         }    
  23.         //执行操作  
  24.         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
  25.         XContentBuilder jsonBuilder = XContentFactory.jsonBuilder()  
  26.                 .startObject()  
  27.                 .field("user","yuchen")  
  28.                 .field("interest","reading book")  
  29.                 .field("insert_time",df.format(new Date()))  
  30.                 .endObject();  
  31.         //1.prepareIndex方法:索引数据到ElasticSearch  
  32.         IndexResponse response = client.prepareIndex("index-test","weibo","4")  
  33.             .setSource(jsonBuilder)  
  34.             .get();  
  35.           
  36.         String _index = response.getIndex();  
  37.         String _type = response.getType();  
  38.         String _id = response.getId();  
  39.         long _version = response.getVersion();  
  40.         boolean created = response.isCreated();  
  41.         System.out.println(_index+" "+_type+" "+_id+" "+_version+" "+created);  
  42.           
  43.         //2.prepareGet方法:获取信息  
  44.         GetResponse getResponse = client.prepareGet("index-test","weibo","1").get();  
  45.         System.out.println(getResponse.getSourceAsString());  
  46.           
  47.         //3.prepareDelete方法:删除信息  
  48.         DeleteResponse deleteResponse = client.prepareDelete("index-test","weibo","4").get();  
  49.         System.out.println(deleteResponse.isFound());  
  50.           
  51.         //4.update方法:更新信息  
  52.         UpdateRequest updateRequest = new UpdateRequest();  
  53.         updateRequest.index("index-test");  
  54.         updateRequest.type("weibo");  
  55.         updateRequest.id("1");  
  56.         updateRequest.doc(XContentFactory.jsonBuilder().startObject().field("interest","music").endObject());  
  57.         UpdateResponse updateResponse = client.update(updateRequest).get();  
  58.         System.out.println(updateResponse.isCreated());  
  59.         //update方法: 可以为已有的文档添加新的字段  
  60.         UpdateResponse updateResponse2 = client.prepareUpdate("index-test""weibo""1")  
  61.             .setDoc(XContentFactory.jsonBuilder()  
  62.                 .startObject()  
  63.                 .field("interest2","reading")  
  64.                 .endObject()).get();  
  65.         System.out.println(updateResponse2.isCreated());  
  66.         //4.1 upsert:在使用update方法时,a:针对文档不存在的情况时,做出index数据的操作,update无效;  
  67.         //                        b:如果文档存在,那么index数据操作无效,update有效;  
  68.         //先构建一个IndexRequest  
  69.         IndexRequest indexRequest = new IndexRequest("index-test","weibo","14");  
  70.         indexRequest.source(XContentFactory.jsonBuilder()  
  71.                 .startObject()  
  72.                 .field("user","yuchen2")  
  73.                 .field("interest","eating")  
  74.                 .field("insert_time",df.format(new Date()))  
  75.                 .endObject());  
  76.         //再构建一个UpdateRequest,并用IndexRequest关联  
  77.         UpdateRequest updateRequest3 = new UpdateRequest("index-test","weibo","14");  
  78.         updateRequest3.doc(XContentFactory.jsonBuilder()  
  79.                 .startObject()  
  80.                 .field("interest2","love")  
  81.                 .endObject()  
  82.                 ).upsert(indexRequest);  
  83.         client.update(updateRequest3).get();  
  84.           
  85.         if(client != null){  
  86.             client.close();    
  87.         }  
  88.     }  

批量操作

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

BulkProcessor设置批量请求的属性

[java]  view plain  copy
  1. //BulkProcessor  
  2. BulkProcessor bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() {  
  3.     @Override  
  4.     public void beforeBulk(long arg0, BulkRequest arg1) {  
  5.         //批量执行前做的事情  
  6.         System.out.println("bulk api action starting...");  
  7.     }  
  8.     @Override  
  9.     public void afterBulk(long arg0, BulkRequest arg1, Throwable arg2) {  
  10.         System.out.println("exception:bukl api action ending...:"+arg2.getMessage());  
  11.     }  
  12.     @Override  
  13.     public void afterBulk(long arg0, BulkRequest arg1, BulkResponse arg2) {  
  14.         //正常执行完毕后...  
  15.         System.out.println("normal:bukl api action ending...");  
  16.     }  
  17. })  
  18. //设置多种条件,对批量操作进行限制,达到限制中的任何一种触发请求的批量提交  
  19. .setBulkActions(1000)//设置批量操作一次性执行的action个数,根据请求个数批量提交  
  20. //.setBulkSize(new ByteSizeValue(1,ByteSizeUnit.KB))//设置批量提交请求的大小允许的最大值  
  21. //.setFlushInterval(TimeValue.timeValueMillis(100))//根据时间周期批量提交请求  
  22. //.setConcurrentRequests(1)//设置允许并发请求的数量  
  23. //设置请求失败时的补偿措施,重复请求3次  
  24. //.setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))  
  25. .build();  
  26. for(int i =0;i<100000;i++){  
  27.     bulkProcessor.add(new IndexRequest("index-test","weibo2",""+i).source(  
  28.             XContentFactory  
  29.             .jsonBuilder()  
  30.             .startObject()  
  31.             .field("name","yuchen"+i)  
  32.             .field("interest","love"+i)  
  33.             .endObject()));  
  34. }  
  35. bulkProcessor.awaitClose(5, TimeUnit.MINUTES);//释放bulkProcessor资源  
  36. 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值