在 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 的使用方法。
-
环境要求 首先,你的项目需要支持 Java8 或以上,并且你的项目需要有一个 Json 对象映射库,比如 Jackson 等,本文章中使用 Jackson 作为示例。
-
安装依赖 在 Gradle 项目中安装:
dependencies { implementation ‘co.elastic.clients:elasticsearch-java:8.0.1’ implementation ‘com.fasterxml.jackson.core:jackson-databind:2.12.3’ } 在 Maven 项目中安装:
// 使用Jackson映射器创建传输层 ElasticsearchTransport transport = new RestClientTransport( restClient, new JacksonJsonpMapper());
// 创建API客户端 ElasticsearchClient client = new ElasticsearchClient(transport); 4. 测试查询请求 注意,需要ES内有相应的数据才可以查到。如没有数据可供测试可以直接跳过本项。
SearchResponse search = client.search(s -> s .index(“products”) .query(q -> q .term(t -> t .field(“name”) .value(v -> v.stringValue(“testname”)) )), Product.class);
for (Hit 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 为你要删除索引的名字。
- 文档 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 response = client.update(e -> e.index(“newapi”).id(“1003”).doc(map), Test.class);
// 打印请求结果 System.out.println(response.result()); 6.3 查询文档 Doc // 构建查询请求 GetResponse 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 客户端 文章知识点与官方知识档案匹配,可进一步学习相关知识 ———————————————— 版权声明:本文为 CSDN 博主「无枫丶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/anjiongyi/article/details/123328856