ElasticSearch API for JAVA 学习笔记

本文涉及的产品
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
简介:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
         //通过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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
      * 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
2
3
4
5
6
7
8
9
10
         //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批量增加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
         //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批量删除:

1
2
3
4
5
6
7
8
9
10
11
         //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 批量更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
         //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设置批量请求的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
         //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.


参考地址:

http://blog.csdn.net/wuyzhen_csdn/article/details/52381697











本文转自yunlielai51CTO博客,原文链接:http://blog.51cto.com/4925054/2084251,如需转载请自行联系原作者


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
打赏
0
0
0
0
101
分享
相关文章
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
38 12
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
1月前
|
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
68 11
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
如何在Java爬虫中设置动态延迟以避免API限制
如何在Java爬虫中设置动态延迟以避免API限制
菜鸟之路Day06一一Java常用API
《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。
111 28
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
418 5
【Java全栈学习笔记-U1-day01】Java介绍
本笔记整理了Java学习的基础内容,涵盖程序理解、Java语言特性、JDK安装与配置、Java程序开发工具及编写步骤。重点介绍了Java程序的基本结构、编译和运行过程,以及输出语句的使用。通过实例演示了IDEA创建Java程序的方法,并强调了编码规范和注意事项。适合初学者复习和交流学习。 主要内容: 1. 理解程序:计算机组成、程序定义。 2. 简介:Java语言特点、技术平台、JDK作用。 3. 编写Java程序:编写、编译、运行步骤,基本结构。 4. 输出语句 5. DEA使用:新建工程、保存位置、文件介绍、新建类。 6. 扩展:注释、代码规范、大小写敏感、缩进等。
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等