专业的JAVA编程教程与资源

网站首页 > java教程 正文

使用Java TransportClient 操作Elasticsearch 7.x (Spring Boot)

temp10 2024-10-13 09:27:31 java教程 8 ℃ 0 评论

本文假定你已经对Elasticsearch 的基本概念有比较全面的认识,然后演示如何使用Elasticsearch 提供的Java API。

通过官方文档可以得知,现在存在至少三种Java客户端。

使用Java TransportClient 操作Elasticsearch 7.x (Spring Boot)

1. Transport Client

TransportClient旨在被Java High-level REST client接口取代。 在 Elasticsearch 7.*版本中将不赞成使用TransportClient,在Elasticsearch 8.0 版本中将被移除,建议使用Java High-level REST Client客户端。

2. Java High Level REST Client

它基于Low-level REST Client接口,并暴露了特定的API方法,负责处理请求的序列化和响应的反序列化。

使用Java High Level REST Client操作最新版Elasticsearch 7.3.0

3. Java Low Level REST Client

它允许HTTP和Elasticsearch集群通信,并将请求的序列化和响应的反序列化交给用户自己处理。

本文演示通过Transport Client来操作Elasticsearch。TransportClient 是一种轻量级的方法,它通过Socket与Elasticsearch集群连接,是基于Netty 线程池的方式。

一、首先创建Spring Boot 项目

创建一个新的Spring Boot 项目,填写相关project metadata 参数。

版本选择最新的Release 版本v2.1.7,其他版本也没问题。

二、Maven 配置

如有兴趣,可以到Elasticsearch 官方网站,查找到相关的文档。

https://www.elastic.co/guide/index.html

找到TransportClient的Maven Repository文档。

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/_maven_repository.html

重要:客户端版本应该和服务端版本保持一致。

在pom文件中,添加如下依赖,这里我们引用v7.3.0 版本。

通过<dependencyManagement>元素来管理jar包的版本,让子项目中引用一个依赖而不用显式的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

dependencyManagement这里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的。

确保项目依赖的transport 依赖包版本一致v7.3.0,Spring boot v2.1.7中spring-boot-start-parent中已经定义了es相关依赖的版本号,默认是v6.4.3,需要强制替换。

三、application.properties 配置文件

在项目的application.properties 配置文件中,添加如下配置。

spring.application.name=transport-client-demo

server.port=8089

elasticsearch.cluster-name=elasticsearch

elasticsearch.host=localhost:9300

设置 ES 的主机地址,以及端口号9200,因为Java客户端的方式是以tcp协议在9300端口上进行通信,因此port=9300。

四、TransportClientConfig 配置类

TransportClient:作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。

TransportClient旨在被Java高级REST客户端取代,该REST客户端执行HTTP请求而不是序列化的Java请求。 在即将到来的Elasticsearch版本中将不赞成使用TransportClient,建议使用Java高级REST客户端。

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html

下面是TransportClientConfig 配置类的完整代码。

package com.rickie.elasticsearch.transportclientdemo.config;

import org.elasticsearch.client.transport.TransportClient;

import org.elasticsearch.common.settings.Settings;

import org.elasticsearch.common.transport.TransportAddress;

import org.elasticsearch.transport.client.PreBuiltTransportClient;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import java.net.InetAddress;

import java.net.UnknownHostException;

@Configuration

public class TransportClientConfig {

@Value("${elasticsearch.host}")

private String host;

@Value("${elasticsearch.cluster-name}")

private String cluster;

@Bean("transportClient")

public TransportClient client() {

try{

// 设置ES实例的名称

Settings settings = Settings.builder().put("cluster.name", cluster).build();

// 创建客户端,如果使用默认配置,传参为 Settings.Empty

TransportClient client = new PreBuiltTransportClient(settings);

// 添加节点

String[] hosts = host.split(";");

for(String host : hosts) {

String ip = host.split(":")[0];

int port = Integer.valueOf(host.split(":")[1]);

// 创建节点

TransportAddress node = new TransportAddress(InetAddress.getByName(ip), port);

client.addTransportAddress(node);

}

System.out.println("Elasticsearch Client 连接成功");

return client;

} catch (UnknownHostException e) {

e.printStackTrace();

}

return null;

}

}

之后,在需要操作elasticsearch的组件中注入TransportClient即可,具体代码在service 类中。

@Autowired

private TransportClient client;

五、开发Elasticsearch 相关的业务代码

项目框架搭建完毕后,我们来尝试着执行一些简单的增删改查操作。

(1)首先,我们构建一个BookService,并且注入TransportClient。

Index API允许用户将一个类型化的JSON文档索引(插入)到一个特定的索引中,并使其可搜索。

完整代码如下所示。

@Service

public class BookService {

@Resource

private TransportClient client;

public String addBook(BookVO vo) {

try {

XContentBuilder content = XContentFactory.jsonBuilder().startObject()

.field("type", vo.getType())

.field("word_count", vo.getWordCount())

.field("author", vo.getAuthor())

.field("title", vo.getTitle())

.timeField("publish_date", vo.getPublishDate())

.endObject();

// output

System.out.println(Strings.toString(content));

IndexResponse response = client.prepareIndex("book2", "_doc")

.setSource(content)

.get();

return response.toString();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

}

上面的代码,使用Elasticsearch自带的工具XContentFactory.jsonBuilder()。

编写controller 类 - BookController,注入BookService。

@RestController

@RequestMapping("book")

public class BookController {

@Resource

private BookService bookService;

@PostMapping("add")

public String add(@RequestBody BookVO vo) {

return bookService.addBook(vo);

}

@GetMapping("test")

public String test() {

return "hello rickie";

}

}

至此,我们的项目框架就搭建完毕了。直接运行,我们可以看到项目已经跑起来了。

请求8089 端口,POST JSON数据:

返回数据:

IndexResponse[index=book2,type=_doc,id=O4Ka62wB19IsZPINE72Y,version=1,result=created,seqNo=1,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]

Console 控制台输出内容:

ES 产生的索引数据:

(2)获取索引中的文档数据

prepareGet() 准备获取,但不执行获取操作。

执行GET 请求,获取指定id的文档数据。

Elasticsearch 可以通过获取多个文档的数据,使用MultiGet API可以实现在不同索引文件中获取多个id 号的内容。

(3)删除索引文件中的文档数据

prepareDelete() 一共三个参数,第一个是索引名称,这里是book2;第二个是类型名称,这里是_doc;第三个是要删除的文档的主键,这里是传入参数id;删除方法返回类型是DeleteResponse。

POST 请求,传入指定的文档id。

删除成功,返回结果:

DeleteResponse[index=book2,type=_doc,id=PYLd62wB19IsZPINv73G,version=2,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]

(4)更新索引文件中的文档数据

调用Client对象的update() 方法,基于Update Request 更新文档,并返回更新后的结果。

执行POST 请求,更新指定id的文档数据。

返回结果:UpdateResponse[index=book2,type=_doc,id=PIKd62wB19IsZPINwr1W,version=2,seqNo=3,primaryTerm=1,result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]

(5)Search API 信息检索

使用SearchSourceBuilder 构造一个Elasticsearch 检索请求。TransportClient.prepareSearch() 方法中设置索引文件名,在setQuery() 方法中设置查询,而这个查询是通过Elasticsearch自带的QueryBuilders() 方法来构建的。

POST 请求,获取查询结果。

Response 结果如下:

{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"_clusters":{"total":0,"successful":0,"skipped":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":0.75491273,"hits":[{"_index":"book2","_type":"_doc","_id":"O4Ka62wB19IsZPINE72Y","_score":0.75491273,"_source":{"type":"pdf","word_count":500,"author":"rickie","title":"Elasticsearch 7.3.0","publish_date":"2019-10-01"}}]}}

上述API 的调用,完整演示代码,可以访问github。

https://github.com/rickiechina/elasticsearch

具体的TransportClient的其他API应用,可以参考Elasticsearch的TransportClient API 文档。

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表