ElasticSearch 8


前言

最近在公司迁移项目到云服务期间,有一个项目迁移需要升级 ElasticSearch。原先用的是 ElasticSearch 6.8 版本的,迁移到云服务之后由于云服务限制,只能升级到了 ElasticSearch 8.x 版本了,对于一些别依赖来说,比如:jdbc driver、redis client 或者 mq client 可能会有些许 API 变化,所以项目中代码改动不大,但是 ElasticSearch 只要升一级,你的项目中极大可能就是 代码上下一片红,惨不忍睹啊,所以一般非必要不升级啊!

一、ElasticSearch 先后弃用另个客户端

ElasticSearch 7.0.0 版本开始,ElasticSearch 官方就不建议使用 TransportClient 客户端了,推荐使用 High Level REST Client 客户端了。
官方快速通道 ,想了解更多的小伙伴可以移步官方文档,慢慢品读,顺便锻炼英语阅读能力。
ElasticSearch官方通知

The TransportClient is deprecated in favour of the Java High Level REST Client and will be removed in Elasticsearch 8.0.
TransportClient 是不赞成的,推荐使用 Java High Level REST Client,并且将要在 Elasticsearch 8.0 移除


然后接下来,从 ElasticSearch 7.15.0 版本开始,ElasticSearch 官方就不建议使用 High Level REST 客户端了,推荐使用 ElasticSearch-java 客户端了。
官方快速通道 ,想了解更多的小伙伴可以移步官方文档,慢慢品读,顺便锻炼英语阅读能力。

ElasticSearch官方通知
The High Level REST Client is deprecated in favour of the Java API Client。
High Level REST Client是不赞成的,推荐使用 JAVA api 客户端,不过 High Level REST Client 7.17 版本可以和 ElasticSearch 8.x 兼容模式下使用。

一、为什么要弃用 TransportClient 呢?

在 Elasticsearch 7.0.0 版本后不建议使用 TransportClient了,为什么呢?是因为它在分布式集群中的使用方式不够灵活且不够健壮。TransportClient 使用内部集群协议进行通信,这会导致以下问题:

  1. 集群版本兼容问题:Transport Client 必须与 ElasticSearch 集群的确切版本匹配,如果有版本不匹配则会出现兼容问题,对版本特别敏感。
  2. 单点故障:Transport Client 需要连接到特定的节点,如果连接的节点发生故障,客户端则无法自动重新连接到集群的其他节点。
  3. 不推荐的跨版本使用: Transport Client 在集群版本升级时可能会遇到问题,因为它需要与集群完全匹配,跨版本使用会引发不兼容性问题,所以使用还不是很灵活。

但 Transport Client 也有有点的,比如:

  1. 低延迟:与集群内部直接通信,可能具有比 REST 客户端更低的延迟。
  2. 直接与集群通信:能够直接在集群内部进行通信和交互。

所以综合考虑,为了更好地兼容不同版本的集群、更灵活地处理节点故障和更广泛地支持 REST Api,在 ElasticSearch 7.x 版本开始使用 High Level REST Client 进行操作了。

二、为什么要弃用 High Level REST Client 呢?

那在 ElasticSearch 7.15.0 版本开始,官方又不建议使用 High Level REST Client 了,为什么呢?因为它是基于原生的 REST API,而这些 API 在某些情况下限制了某些功能的性能优化。与此同时,官方也推出了 Elasticsearch Java 客户端(Java 客户端)作为替代方案。这个新客户端旨在提供更好的性能、更好的稳定性,并且更易于维护和开发。
缺点如下:

  1. 性能损耗:由于是基于 REST API 的封装,可能存在性能上的一些损耗,比如相比原生的 Java 客户端可能有更高的延迟。
  2. 功能限制:High Level REST Client 对于一些高级或较新的功能可能提供支持不够或者存在一些限制。

优点如下:

  1. 易用性高:High Level REST Client 封装了底层的 REST API,提供了了更直观、更易用的开发方法调用 ElasticSearch 的功能。
  2. 开发效率
  3. 较好的兼容性

虽然 High Level REST Client 在易用性和开发效率方面有优势,但是为了获得更好的性能、更好的稳定性,并且获得更多的特性支持,官方建议从 Elasticsearch 7.15.0 版本开始,使用新的 Java 客户端进行操作。

三、Elasticsearch Java API 如何使用

3.1 pom 依赖

<dependencies>
    <dependency>
        <groupId>co.elastic.clients</groupId>
        <artifactId>elasticsearch-java</artifactId>
        <version>8.7.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.3</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

3.2 ES Client 初始化

注意:修改 ES 的用户名密码

/\*\*
 \* 初始化客户端
 \* @return
 \*/
private static ElasticsearchClient initClient(){
    String hostname = "192.168.\*.\*";
    int port = 9200;
    String username = "your username";
    String password = "your password";
    // 基本的用户名密码认证
    BasicCredentialsProvider basicCredentialsProvider = new BasicCredentialsProvider();
    basicCredentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
    RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(hostname, port, "http"));
    restClientBuilder.setHttpClientConfigCallback(httpAsyncClientBuilder ->
            httpAsyncClientBuilder.setDefaultCredentialsProvider(basicCredentialsProvider));
    RestClient restClient = restClientBuilder.build();
    ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
    ElasticsearchClient esClient = new ElasticsearchClient(transport);
    return esClient;
}

3.3 创建 Index

ElasticSearch-java 客户端可以使用连续调用的方式进行编程。

/\*\*
 \* 创建索引
 \*/
private static void createIndex() throws IOException {
    ElasticsearchClient esClient = initClient();
    CreateIndexResponse createIndexResponse = esClient.indices().create(
            new CreateIndexRequest.Builder()
                    .index("product\_info")
                    .aliases("product\_info\_alias",
                            new Alias.Builder().isWriteIndex(true).build()
                    ).build());
    if(createIndexResponse.acknowledged()){
        System.out.println("创建索引成功!");
    } else {
        System.out.println("创建索引失败!");
    }
}

3.4 添加数据

定义产品信息实体类 ProductInfo

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProductInfo {
    private String productName;
    private String productDescription;
    private String color;
    private Integer price;
}

ElasticSearch-java 客户端是以 document 的方式添加数据到 ES,这个 document 就是一个 Object 对象,就是把我们创建的实体直接通过写入 Index 中,这样使用起来更加方便。

private static void addData() throws IOException {
    ElasticsearchClient esClient = initClient();
    ProductInfo productInfo = new ProductInfo("红米手机", "红米 Note,智能手机,价格便宜", "蓝色", 999);
    CreateResponse createResponse = esClient.create(createRequest -> createRequest.id("1003").index("product\_info").document(productInfo));
    System.out.println("添加索引请求结果:" + createResponse.result());
}

3.5 删除数据

以下是比较简单的删除操作,直接通过 ID 进行删除:

private static void delDataVidId(String id) throws IOException {
    ElasticsearchClient esClient = initClient();
    DeleteResponse deleteResponse = esClient.delete(deleteReqest -> deleteReqest.index("product\_info").id(id));
    System.out.println("按照 ID 删除索引数据结果:" + deleteResponse.result());
}

但有时候需要按照某个条件删除,该如何做呢?代码如下:
注意:下面示例是按照条件删除的,比如参数 value 是 “苹果手机”,因为通过 productName 检索会把 “苹果” 和 “手机” 的都检索出来,那样的话就都删除了。

private static void delDataVidQuery(String value) throws IOException {
    ElasticsearchClient esClient = initClient();
    DeleteByQueryResponse deleteByQueryResponse = esClient.deleteByQuery(deleteByQuery -> 
            deleteByQuery.index("product\_info").query(query -> 
                    query.match(MatchQuery.of(builder ->
                            builder.field("productName").query(value)))));
    System.out.println("按照条件删除索引数据结果:" + deleteByQueryResponse.deleted());
}

那我们只想删除 “苹果手机” 的数据该如何做呢?其实很简单,以 keyword【productName.keyword】的形式查询就行,代码如下:

private static void delDataVidQuery(String value) throws IOException {
        ElasticsearchClient esClient = initClient();
        DeleteByQueryResponse deleteByQueryResponse = esClient.deleteByQuery(deleteByQuery ->


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/8c743db0347a705b9244c91da566b88b.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/a1def2b0600de67a68f5be892703012c.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f1e15bc0357e66ea632c94573b1c6cc.png)
![img](https://img-blog.csdnimg.cn/img_convert/79720d17df3c38d21b4e9f66a5a518f2.png)
![img](https://img-blog.csdnimg.cn/img_convert/fc87967dd18a7f54d549c1ee7f3b84de.png)
![img](https://img-blog.csdnimg.cn/img_convert/c57db93204a8b5c0dc6130eed34682ce.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/4a1f7fd2d4b660d9510e94bb45a0ef82.jpeg)



# 总结

机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。

对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。

你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。下图涵盖了应届生乃至转行过来的小白要学习的Java内容:

**请转发本文支持一下**

![](https://img-blog.csdnimg.cn/img_convert/ccf15ad4cc7699ba83f50d1d0da8c9b4.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/f13adbff9fa5c1cd3adbb971cd0adab0.webp?x-oss-process=image/format,png)



**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/86d8dbde6edb926b7d4a4e277b8abfd0.jpeg)

图涵盖了应届生乃至转行过来的小白要学习的Java内容:

**请转发本文支持一下**

[外链图片转存中...(img-YZjWGkCh-1712841697058)]

[外链图片转存中...(img-v2PFiNKw-1712841697058)]



**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-YrtDNwya-1712841697058)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值