Spring Data Elasticsearch 5.0升级指南

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Spring Data Elasticsearch 5.0升级指南

了解最新的 Spring Data Elasticsearch 5.0.1 和 Elasticsearch 8.5.3,从正确配置 Elasticsearch Docker 镜像开始。

最近,我写了文章“使用 Spring Data Elasticsearch 4.4 进行分页”,但我们已经有了新的 Spring Data Elasticsearch 5.0 和Spring Boot 3.0 版本。在进行升级时,我们应该考虑几个变化和问题。

本文的目的是强调使用这些技术升级sat-elk项目时的变化:

  1. 弹簧数据弹性搜索 5.0.1
  2. 春季启动 3.0.2
  3. 弹性搜索 8.5.3

主要变化

  • Elasticsearch 8.5 默认启用了 SSL。
  • Spring Data Elasticsearch 5.0 使用新的 Elasticsearch 客户端库。
  • Spring Boot 3.0 从javax移至jakartapackage (dependencies)。
  • SearchHits行为有点不同。

在本文中,您将了解

  • 如何设置 Elasticsearch 8.5.3
  • 如何在项目中配置Spring Data Elasticsearch 5.0
  • 如何处理升级到最新技术

Elasticsearch

我们的目标是有一个应用程序通过 Elasticsearch 中的 Spring Data Elasticsearch 来管理数据。您可以在我最初的文章“ Spring Data Elasticsearch 4.1 简介”中找到更多详细信息。在这里,您只能找到具有突出显示差异或更改的基本步骤。

让我们先检查一下变化。

变化

上一篇文章使用了 4.4 版本的 Spring Data Elasticsearch,但最新版本(在撰写本文时)是 5.0.1 版本。您可以在此处找到所有详细信息。

我们应该牢记包含主要技术兼容版本的兼容性矩阵-> Spring 框架、Spring Boot、Spring Data Release Train、Spring Data Elasticsearch,当然还有 Elasticsearch 本身。

我们的版本由 Spring Boot 3.0.2 和 Spring Data Release Train 2022.0.1 驱动。

Docker Setup

elasticsearch使用的Docker镜像的第一个重大变化  是默认切换到 HTTPS 而不是以前的 HTTP。这些版本中 Elasticsearch 配置(位于文件中)的差异是:/usr/share/elasticsearch/config/elasticsearch.yml

Elasticsearch 7.17.8:

cluster.name: "docker-cluster"
network.host: 0.0.0.0
复制代码

Elasticsearch 8.5.3:

cluster.name: "docker-cluster"
network.host: 0.0.0.0
# Enable security features
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
复制代码

之前的提示(请参阅我之前文章中的“在 Elasticsearch 中禁用 XPack”部分)现在不起作用,可能是因为它是一种变通方法。因此,我们应该适当地禁用 X-Pack 安全性。

让我们按照以下步骤正确设置 Elasticsearch。

自定义网络

docker network create sat-elk-net
复制代码

Elasticsearch

docker run -d --name sat-elasticsearch --net sat-elk-net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" elasticsearch:8.5.3
复制代码

注意:请参阅-e "xpack.security.enabled=false"用于禁用 HTTPS 的额外参数。

ElasticHQ

docker run -d  --name sat-elastichq --net sat-elk-net -p  5000 :5000 elastichq/elasticsearch-hq
复制代码

Spring Data Elasticsearch

可以在此处找到 5.0.x 版的所有升级说明/提示。

Maven 依赖

我们在Maven项目 ( ) 中使用spring-boot-starter-data-elasticsearch依赖项,如下所示。我们可以在Maven 中央存储库中找到最新的可用版本。pom.xml

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  <version>3.0.2</version>
</dependency>
复制代码

此外,我们的代码还依赖于Spring MVC(用于公开 REST 端点)和jackson.dataformatCSV 模块(用于读取 CSV 文件)。我们应该将它们添加到我们的项目中:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>3.0.2</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-csv</artifactId>
  <version>2.14.1</version>
</dependency>
复制代码

Elasticsearch client

第二个关键变化(在 Elasticsearch Docker 镜像配置之后)表示 Spring Data Elasticsearch 使用的新 Elasticsearch 客户端。到目前为止,我们使用文件中的配置spring.elasticsearch.urisapplication.properties但现在不起作用。

我们仍然可以通过小的调整重新使用它:

spring:
  elasticsearch:
    rest:
      uris: oxygen-arnost.ifs.dev.fra.aws.dbgcloud.io:9200
复制代码

注意: 仅删除了领先的协议。

对于新的 Elasticsearch 客户端,我们需要添加一个ElasticsearchClientConfig类,我们将此配置属性用作:

爪哇

@Configuration
public class ElasticsearchClientConfig extends ElasticsearchConfiguration {
  @Value("${spring.elasticsearch.rest.uris}")
  String connetionUrl;
  @Override
  public ClientConfiguration clientConfiguration() {
    return ClientConfiguration.builder()
        .connectedTo(connetionUrl)
        .build();
  }
}
复制代码

ElasticsearchClientConfigTest为了满足Sonar,我们还需要为这个类添加一个测试。

@SpringBootTest
class ElasticsearchClientConfigTest {
  @MockBean
  CityRepository cityRepository;
  @Autowired
  ElasticsearchClientConfig elasticsearchClientConfig;
  @Test
  void clientConfiguration() {
    assertThat(elasticsearchClientConfig.connetionUrl).contains("oxygen-arnost");
  }
}
复制代码

SearchHitsImpl 更改

在上一篇文章中,有两个与我们使用SearchHits接口相关的小问题。

SearchHitsImpl 更改接口

从 5.0 版开始,SearchHitsImpl类的构造函数被扩展了一个新的pointInTimeId参数。它对我们的实现没有影响,因为它仅用于最终被删除的测试。

更改没有很好地记录,但可以在SearchHits类中找到定义:

使用时间点进行搜索时,响应包含新的时间点 ID 值。

不为聚合工作 Jackson 转换

从 Spring Data Elasticsearch 5.0.1 开始,SearchHit实例包含aggregations属性 filled(在之前的版本中为 null)。

查看 Spring Data Elasticsearch 4.4.6 的结果:

网络异常,图片无法展示
|

以及 Spring Data Elasticsearch 5.0.1。

网络异常,图片无法展示
|

搜索操作本身工作正常。当我们尝试将SearchHits结果作为 JSON 直接发送给客户端时,就会出现此问题。Spring 不包含AggregationsContainer该类的任何转换器并产生此错误:

2023-01-05T08:28:44.707+01:00 ERROR 6656 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregations]] with root cause
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregations and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.springframework.data.elasticsearch.core.SearchHitSupport$SearchPageImpl["searchHits"]->org.springframework.data.elasticsearch.core.SearchHitsImpl["aggregations"])
  at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.14.1.jar:2.14.1]
  at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1306) ~[jackson-databind-2.14.1.jar:2.14.1]
  at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:408) ~[jackson-databind-2.14.1.jar:2.14.1]
  at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:53) ~[jackson-databind-2.14.1.jar:2.14.1]
  at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:30) ~[jackson-databind-2.14.1.jar:2.14.1]
  ...
  at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
复制代码

因此,我们可以使用分页简化我们的搜索功能:

  • 删除and 中的 previoussearchPagesearchHits方法。CityController``CityService
  • 修改我们的search方法CityService为:
@SuppressWarnings("unchecked")
public Page<City> search(String name, String country, String subcountry, Pageable pageable) {
  return (Page<City>) unwrapSearchHits(searchPageFor(searchHits(name, country, subcountry, pageable), pageable));
}
复制代码

这样我们就可以通过分页实现动态搜索,而无需解决SearchHits相关问题。

可以在 http://localhost:8080/api/cities?name=be&country=Czech&subcountry=bohemia&size=5&sort=name,asc 上使用以下输出验证新的动态搜索实现:

{
  "content": [
    {
      "id": "ePHmOIUBcEaiCL6qmck4",
      "name": "Benešov",
      "country": "Czech Republic",
      "subcountry": "Central Bohemia",
      "geonameid": 3079508
    },
    ...
  ],
  "pageable": {
    "sort": {
      "empty": false,
      "sorted": true,
      "unsorted": false
    },
    "offset": 0,
    "pageSize": 5,
    "pageNumber": 0,
    "paged": true,
    "unpaged": false
  },
  "last": true,
  "totalElements": 3,
  "totalPages": 1,
  "size": 5,
  "number": 0,
  "sort": {
    "empty": false,
    "sorted": true,
    "unsorted": false
  },
  "first": true,
  "numberOfElements": 3,
  "empty": false
}
复制代码

结论

本文介绍了使用 Elasticsearch 8.5.3(在本文发布时)升级到最新的 Spring Data Elasticsearch 5.0.1。我们从正确配置 Elasticsearch Docker 镜像开始。接下来,我们演示了由于新的 Elasticsearch 客户端库而改变的配置。最后,我们总结了我们应用程序中所有需要的修复,以使我们的所有功能再次像以前一样工作。


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 搜索推荐 Java
|
1天前
|
安全 Java API
Java一分钟之-Spring Data REST:创建RESTful服务
【6月更文挑战第15天】Spring Data REST让基于Spring Data的项目轻松创建REST API,免去大量控制器代码。通过自动HTTP映射和链接生成,简化CRUD操作。文章涵盖启用REST、配置仓库、自定义端点、解决过度暴露、缺失逻辑和安全性问题,提供代码示例,如自定义Repository、投影和安全配置,强调在利用其便利性时注意潜在挑战。
19 5
|
6天前
|
NoSQL Java MongoDB
Java一分钟之-Spring Data MongoDB:MongoDB集成
【6月更文挑战第11天】Spring Data MongoDB简化Java应用与MongoDB集成,提供模板和Repository模型。本文介绍其基本用法、常见问题及解决策略。包括时间字段的UTC转换、异常处理和索引创建。通过添加相关依赖、配置MongoDB连接、定义Repository接口及使用示例,帮助开发者高效集成MongoDB到Spring Boot应用。注意避免时间差、异常处理不充分和忽视索引的问题。
27 0
|
7天前
|
缓存 NoSQL Java
Java一分钟之-Spring Data Redis:使用Redis做缓存
【6月更文挑战第10天】Spring Data Redis是Spring框架的一部分,简化了Java应用与Redis的集成,支持多种数据结构操作。本文介绍了其基本使用,包括添加依赖、配置Redis连接及使用RedisTemplate。还讨论了常见问题,如序列化、缓存穿透和雪崩,并提供解决方案。通过实战示例展示了缓存与数据库读写分离的实现,强调了Spring Data Redis在提升系统性能中的作用。
32 0
|
7天前
|
SQL Java 数据库
Java一分钟之-Spring Data JPA:简化数据库访问
【6月更文挑战第10天】Spring Data JPA是Spring Data项目的一部分,简化了Java数据库访问。它基于JPA,提供Repository接口,使开发者能通过方法命名约定自动执行SQL,减少代码量。快速上手包括添加相关依赖,配置数据库连接,并定义实体与Repository接口。常见问题涉及主键生成策略、查询方法命名和事务管理。示例展示了分页查询的使用。掌握Spring Data JPA能提升开发效率和代码质量。
28 0
|
10天前
|
Java
springboot和elasticsearch以及springboot data elasticsearch对应的版本
springboot和elasticsearch以及springboot data elasticsearch对应的版本
|
1月前
|
移动开发 前端开发 NoSQL
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
ruoyi-nbcio从spring2.7.18升级springboot到3.1.7,java从java8升级到17(二)
159 0
|
1月前
|
自然语言处理 安全 Linux
干货 | Elasticsearch 8.X 版本升级指南
干货 | Elasticsearch 8.X 版本升级指南
45 0
|
1月前
|
SQL Java 数据库连接
Springboot框架整合Spring Data JPA操作数据
Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。
|
1月前
|
索引
Elasticsearch exception [type=illegal_argument_exception, reason=index [.1] is the write index for data stream [slowlog] and cannot be deleted]
在 Elasticsearch 中,你尝试删除的索引是一个数据流(data stream)的一部分,而且是数据流的写入索引(write index),因此无法直接删除它。为了解决这个问题,你可以按照以下步骤进行操作: