最近,我的一个项目需要使用在 AWS Elasticsearch 服务域上运行的 Elasticsearch。当我在 AWS 上创建集群时,我发现 AWS Elasticsearch 服务域不支持 Transport Client。
为什么我关心 Transport Client?
远程通信到 Elasticsearch 集群有两种方式:
- Transport Client
- 基于 HTTP 的 RESTful API 为了从 Java 应用程序中与 Elasticsearch 通信,很多人使用 Transport Client。在之前的两个项目中,我使用了 Java API 和 Spring Data。这两种技术都使用了 Transport Client。我很喜欢 Spring Data,它可以让你的生活变得非常容易,这是我关心 TCP 的原因之一。总之,长话短说,我只剩下了第二个选项。这里需要注意的一件事是,根据其中一位开发人员的说法,Elasticsearch 计划在未来摆脱 Transport Client。因此,如果你正在开发一个新的应用程序,考虑不使用 TCP 可能是值得的。
Java High Level REST Client 来拯救!
好消息是 Elasticsearch 开发了一个名为 Java High Level REST Client 的库。所以如果你对如何使用这个库感到兴奋,请继续阅读。
在本文中,我将提供逐步指导,使用 Spring Boot 构建一个微服务,它将使用 JHLRC 与 AWS Elasticsearch 服务域通信。
在深入代码之前,让我们创建一个用例。假设我们正在开发一个小型档案应用程序。你可以把它想象成 LinkedIn 的孩子,处于胚胎阶段。我们将能够创建一个人的档案。一个档案将包括人的名字、姓氏、技术列表、在这些技术上的经验年数和电子邮件地址列表。
我们应该能够:
- 创建档案
- 更新档案
- 通过 Id 查找档案
- 查找所有档案
- 搜索所有与特定技术匹配的档案
- 通过 id 删除档案
就这么简单。
使用 JHLRC 的逐步指南
我们需要的第一件事是在 AWS 上创建 Elasticsearch 集群。我们将使用免费版,每月免费使用750小时,最多可使用10GB内存。
如果你还没有 AWS 帐户,请先创建一个。我假设你已经有了一个。那么我们开始吧。
步骤1:首先创建 Elasticsearch 集群。Amazon 有一篇非常好的文档,介绍如何创建 Elasticsearch 集群,也称之为 Elasticsearch 服务域。你可以在下面的链接中找到有关如何在 AWS 中创建 ES 集群的信息。
步骤2:如果你正在阅读步骤2,我假设你已经在 AWS 上运行了 Elasticsearch。这意味着你已经得到了 AWS 提供的链接,如果你在公共网络上创建了域,链接可能是这样的:
“search-dev-elasticsearch-5bgsa4vpjib46bgh4cbtebsxydiq.us-east-.es.amazonaws.com”
一旦你收到了上面的链接,你现在可以使用 HTTP 协议与 Elasticsearch 通信。例如,如果你想查看集群的健康状况,你可以在浏览器中简单地输入 URL 和 Elasticsearch 端点,如下所示。不要复制这个链接并粘贴到你的浏览器中(它不起作用),复制你从 AWS 得到的链接 :-)
search-dev-elasticsearch-5bgsa4vpjib46bgh4cbtebsxydiq.us-east-1.es.amazonaws.com/_cluster/health
你应该会看到像这样的集群信息:
现在是时候在 AWS Elasticsearch 服务域中创建索引了。使用你最喜欢的 REST 客户端,或者你可以使用 AWS 为你创建的 Kibana,也给了你一个链接。
步骤3:让我们将以下映射和设置发送到 Elasticsearch,以创建名为“profile”的索引。
在上面的截图中,你可能已经注意到“technologies”字段的数据类型是“nested”。如果你好奇为什么,原因是我们的一个用例是能够搜索存储在类似于数组的结构中的技术,按照技术的元素进行搜索,需要将类型设置为“nested”。
现在我们已经准备好 Elasticsearch 集群,并且我们有一个名为“profile”的索引。所以,让我们继续创建我们的 Spring Boot 微服务。
步骤4:转到 Spring Initializer,网址为 https://start.spring.io/,在 Dependencies 搜索字段中选择 Web 和 Lombok。单击“Generate Project”,它会下载一个 zip 文件。
步骤5:现在让我们将 Java High Level Rest Client 添加到 POM 文件中。在你最喜欢的 IDE 中打开项目,并将此依赖项添加到 POM 文件中。
步骤6:现在我们准备好编写代码了。首先要做的是,让我们创建一个 config 文件夹并创建一个名为 ElasticsearchConfiguration 的类。让我们创建一个端点来创建档案信息。下面是它的样子:
步骤7:让我们将 AWS Elasticsearch URL 添加到 application.properties 文件中。
它看起来像这样:
现在启动 Spring Boot 应用程序。如果你没有收到任何异常,那么我们到目前为止做得很棒 :-)步骤8:让我们创建一个Java Bean类,它将映射到Elasticsearch索引的所有源字段。由于Elasticsearch是基于文档的存储,让我们称我们的Profile Bean类为ProfileDocument。ProfileDocument=_source在ES中。
步骤9:让我们创建一个控制器,以便客户端可以使用我们的Spring Boot微服务创建个人资料。创建一个名为ProfileController和一个名为ProfileService的类。
步骤10:你可能已经注意到ProfileService类中有一个ObjectMapper引用变量。我们需要它将我们的ProfileDocument对象转换为Map对象。这是因为当你使用HighLevel Rest Client将ProfileDocument对象发送到Elasticsearch时,你需要将其发送为Map或JSON格式的字符串。JSON格式的字符串不可读且看起来混乱,这就是为什么我使用ObjectMapper的原因。为了使用ObjectMapper,让我们将其添加到POM文件中。
步骤11:到目前为止都很好。让我们使用我们的微服务创建个人资料。我使用Postman发送个人资料信息。
步骤12:让我们创建一个端点来查找我们刚刚创建的文档。我们将在控制器中创建一个端点和一个名为findById的ProfileService类方法。
将以下函数添加到ProfileController类中。
并将以下代码添加到ProfileService类中。
步骤13:让我们使用Postman查找文档。
步骤14:我们创建了文档,现在我们也应该能够更新文档。让我们创建_update_方法。我们将创建两种方法:一个名为ProfileController中的updateProfile,另一个名为ProfileService类中的updateProfile。
现在让我们使用Postman调用我们的updateProfile端点。我们将把名字从“Bob”更新为“Blah”。
步骤15:现在让我们创建findAll端点和服务类中的findAll方法。
以上方法返回getSearchResult(searchResponse)。我创建了这个方法,因为SearchResponse返回SearchHit数组。我们需要将源响应转换为ProfileDocument对象并将其制作成Java列表而不是数组。我喜欢Stream类,它太棒了!
以下是它的外观。我相信它可以得到很大的改善:-)
让我们做更有趣的事情。现在,让我们添加一个按技术搜索的端点。因此,如果有一个知道Angular6的人的个人资料,我们应该得到该个人资料。
将以下代码添加到ProfileController.java:
现在让我们在ProfileService类中创建searchByTechnology方法。在这里,我们可以重复使用我们的朋友getSearchResult方法,这是我们之前创建的。
现在让我们从Postman尝试这个。
到目前为止还不错,对吧?让我们做最后一件事,即删除操作。
首先让我们创建端点。
并在ProfileService类中创建delete方法。
该代码可在以下链接中找到。
spati-java/spring-boot-java-highlevel-rest-client-elasticsearch
参考资料:
The Elasticsearch Java High-Level Rest Client is Out
Other Supported Resources — Amazon Elasticsearch Service
Java High Level REST Client | Java REST Client [master] | Elastic
评论(0)