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

本文的目的是重点介绍使用这些技术升级 sat-elk 项目时的变化:

  1. Spring Data Elasticsearch 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 从 移动到javaxjakarta包(依赖项)。
  • SearchHits行为略有不同。

在本文中,您将学习

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

弹性搜索

我们的目标是有一个应用程序通过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驱动2 和春季数据发布列车 2022.0.1.

码头工人设置

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

弹性搜索 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

弹性搜索

 

@Configuration
public class ElasticsearchClientConfig extends ElasticsearchConfiguration {

	@Value("${spring.elasticsearch.rest.uris}")
	String connetionUrl;

	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder()
				.connectedTo(connetionUrl)
				.build();
	}

}

我们还需要为此类添加一个 ElasticsearchClientConfigTest 测试以满足声纳connetionUrl).contains(“oxygen-arnost”);
}

}’ data-lang=“text/x-java”>

@SpringBootTest
class ElasticsearchClientConfigTest {

	@MockBean
	CityRepository cityRepository;

	@Autowired
	ElasticsearchClientConfig elasticsearchClientConfig;

	@Test
	void clientConfiguration() {
		assertThat(elasticsearchClientConfig.connetionUrl).contains("oxygen-arnost");
	}

}

搜索命中数更改

在上一篇文章中,有两个与界面使用 SearchHits 相关的小问题。

搜索命中 Impl 更改了界面

从版本 5.0 开始,该类的 SearchHitsImpl 构造函数使用新 pointInTimeId 参数进行了扩展。它对我们的实现没有影响,因为它只用于毕竟被删除的测试。

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

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

聚合的杰克逊转换不起作用

从 Spring Data Elasticsearch 5.0.1 开始,该 SearchHit 实例包含 aggregations 属性填充(在以前的版本中为空)。 

查看 Spring Data Elasticsearch 4.4.6 的结果:

Result from Spring Data Elasticsearch 4.4.6

也来自Spring Data Elasticsearch 5.0.1。

Result from Spring Data Elasticsearch 5.0.1

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

纯文本

 

@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
}

结论

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

上面演示的完整源代码可在我的 GitHub 存储库中找到。所有更改(与此升级相关)在 PR #58 中可见。

Comments are closed.