jjzjj

Elasticsearch RestHighLevelClient 已标记为被弃用 它的替代方案 Elasticsearch Java API Client 的基础教程及迁移方案

无枫丶 2023-08-27 原文

在Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的Java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。

Elasticsearch Java API Client 支持除 Vector tile search API 和 Find structure API 之外的所有 Elasticsearch API。且支持所有API数据类型,并且不再有原始JsonValue属性。它是针对Elasticsearch8.0及之后版本的客户端,目前Elasticsearch已经更新至8.0.1,所以我们需要学习新的Elasticsearch Java API Client的使用方法。

1. 环境要求

首先,你的项目需要支持Java8或以上,并且你的项目需要有一个Json对象映射库,比如Jackson等,本文章中使用Jackson作为示例。

2. 安装依赖

在Gradle项目中安装:

dependencies {
    implementation 'co.elastic.clients:elasticsearch-java:8.0.1'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'
}

在Maven项目中安装:

<project>

  <dependencies>
    <dependency>
      <groupId>co.elastic.clients</groupId>
      <artifactId>elasticsearch-java</artifactId>
      <version>8.0.1</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.3</version>
    </dependency>
  </dependencies>

</project>

3. 连接

// 创建低级客户端
RestClient restClient = RestClient.builder(
    new HttpHost("localhost", 9200)).build();

// 使用Jackson映射器创建传输层
ElasticsearchTransport transport = new RestClientTransport(
    restClient, new JacksonJsonpMapper());

// 创建API客户端
ElasticsearchClient client = new ElasticsearchClient(transport);

4. 测试查询请求

注意,需要ES内有相应的数据才可以查到。如没有数据可供测试可以直接跳过本项。

SearchResponse<Product> search = client.search(s -> s
    .index("products")
    .query(q -> q
        .term(t -> t
            .field("name")
            .value(v -> v.stringValue("testname"))
        )),
    Product.class);

for (Hit<Product> hit: search.hits().hits()) {
    processProduct(hit.source());
}

5. 索引Index的基本操作

5.1 创建索引

// 创建连接
RestClient restClient = RestClient.builder(
        new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(
        restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);

// 创建索引
CreateIndexResponse createIndexResponse = client.indices().create(c -> c.index("newapi"));
// 打印结果
System.out.println(createIndexResponse.acknowledged());

// 关闭连接
transport.close();
restClient.close();

其中,newapi为你要创建索引的名字。

5.2 查询索引

// Create the low-level client
RestClient restClient = RestClient.builder(
        new HttpHost("localhost", 9200)).build();
// Create the transport with a Jackson mapper
ElasticsearchTransport transport = new RestClientTransport(
        restClient, new JacksonJsonpMapper());
// And create the API client
ElasticsearchClient client = new ElasticsearchClient(transport);
GetIndexResponse createIndexResponse = client.indices().get(e->e.index("newapi"));
System.out.println(String.join(",", createIndexResponse.result().keySet()));
transport.close();
restClient.close();

其中,newapi为你要查询索引的名字。

5.3 删除索引

// Create the low-level client
RestClient restClient = RestClient.builder(
        new HttpHost("localhost", 9200)).build();
// Create the transport with a Jackson mapper
ElasticsearchTransport transport = new RestClientTransport(
        restClient, new JacksonJsonpMapper());
// And create the API client
ElasticsearchClient client = new ElasticsearchClient(transport);
DeleteIndexResponse deleteIndexResponse = client.indices().delete(e->e.index("newapi"));
System.out.println(deleteIndexResponse.acknowledged());
transport.close();
restClient.close();

其中,newapi为你要删除索引的名字。

6. 文档Doc的基本操作

6.1 创建文档Doc

// 创建一个需要保存至ES的对象
Test test = new Test();
test.setName("添加测试");
test.setSex("男");
test.setAge(24);

// 构建一个创建Doc的请求
CreateResponse createResponse = client.create(e->e.index("newapi").id("1003").document(test));

// 打印请求结果
System.out.println(createResponse.result());

其中,index为文档Doc所属索引的名字,id为该文档的id,document参数现在可以直接传入Java对象了。

6.2 修改文档Doc

// 构建需要修改的内容,这里使用了Map
Map<String, Object> map = new HashMap<>();
        map.put("age", 35);

// 构建修改文档的请求
UpdateResponse<Test> response = client.update(e -> e.index("newapi").id("1003").doc(map), Test.class);

// 打印请求结果
System.out.println(response.result());

6.3 查询文档Doc

// 构建查询请求
GetResponse<Test> response = client.get(e -> e.index("newapi").id("1003"), Test.class);

// 打印查询结果
System.out.println(response.source().toString());

6.4 删除文档Doc

// 构建删除文档请求
DeleteResponse response = client.delete(e -> e.index("newapi").id("1001"));

// 打印请求结果
System.out.println(response.result());

更多新版客户端Elasticsearch Java API Client的批量及复杂查询相关操作已更新,可以查阅我的新文章:Elasticsearch8.0版本中Elasticsearch Java API Client客户端的基本使用方法_无枫的博客,分享Java及Vue方向的技术文章-CSDN博客

如何从高级客户端High Level Rest Client迁移至新版客户端Elasticsearch Java API Client?

        根据官方给出的答案是无法平滑的迁移,不过新版客户端和旧版高级客户端是可以共存的,并且没有操作开销。所以在你的项目中可以逐步的从旧版客户端迁移至新版客户端。

        并且,官方还提供了使High Level Rest Client和Elasticsearch Java API Client使用相同的传输通道的方案,他可以使两个客户端共享相同的Low Level Rest Client,管理所有连接,循环策略的网络层以及节点嗅探等工作。

        以下代码展示了如何使用相同的HTTP客户端同时初始化新客户端和旧客户端:

// 创建低级客户端(新版客户端内容)
RestClientBuilder httpClientBuilder = RestClient.builder(
    new HttpHost("localhost", 9200)
);

// 创建旧版高级客户端RestHighLevelClient 
RestHighLevelClient hlrc = new RestHighLevelClient(httpClientBuilder);

// 使用相同的低级客户端创建新的Java客户端
ElasticsearchTransport transport = new RestClientTransport(
    hlrc.getLowLevelClient(),
    new JacksonJsonpMapper()
);

ElasticsearchClient esClient = new ElasticsearchClient(transport);

// 新旧客户端共享相同的http客户端

有关Elasticsearch RestHighLevelClient 已标记为被弃用 它的替代方案 Elasticsearch Java API Client 的基础教程及迁移方案的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  3. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  6. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  7. ruby - 允许主机名包含下划线的 URI.parse 的替代方法 - 2

    我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:

  8. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts

  9. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  10. ruby-on-rails - 将 Ruby 代码和文字标记与 Haml 混合 - 2

    如何用HAML编写这个ERB:#OR我可以:=some_ruby_code+":"#and=some_ruby_code%br但我不想在这里连接,我想将它写成内联:(=some_ruby_code):#and(=some_ruby_code)%br 最佳答案 =some_ruby_code+":"-#and=some_ruby_code+""编辑1:我不确定您在寻找什么。你想要其中之一吗?==#{some_ruby_code}:-#and==#{some_ruby_code}或==#{some_ruby_code}:-#and=so

随机推荐