一、前言
对SpringBoot、SpringBoot Data ElasticSearch以及ElasticSearch的安装版本是有要求的,如果确定安装的ElasticSearch的版本是合适的,可以参考下列连接,否则就要自己去创建连接,完成CURD
二、ElasticSearch的介绍说明
ElasticSearch相当于一个分布式数据库
ES官网
三、Java操作ES
使用客户端调用es服务的两种方式
有两种方式,一种 是9200端口或叫rest 接口,
另一种是用 节点的9300端口或叫 TransportClient
Java API (Java API操作ES方式,此方式使用的是TransportClient方式,9300端口,已在7.00版本之后弃用)
image.png简言之:
在es7开始就废弃transportClient了,在es8后移除;据说是因为他们觉得效率低下。目前推荐使用restClient进行增删改查。
四、使用REST Client的方式(使用9200端口)
因为之前通过transportClient的方式被移除了,所以主流的使用REST
4.1 SpringBoot 整合 ES
SpringBoot整合ES的三种方式(API、REST Client、Data-ES)
SpringBoot整合ES的三种方式(API、REST Client、Data-ES) (REST Client方法可参考)
4.1.1 版本问题
Spring Data for Elasticsearch(github地址)
Spring Data for Elasticsearch(spring.io地址)
springboot、spring-data-elasticsearch、elasticsearch版本对应(spring.io地址)
4.1.2 集成参考
Spring Boot & ES 实战,值得参考!
spring-data-elasticsearch与elasticsearch版本对应
Spring Boot整合Spring Data Elasticsearch 踩坑
spring + spring data elasticsearch+ elasticsearch 使用ElasticsearchRestTemplate高亮查询!
4.1.3 ElasticsearchRepository
SpringBoot整合Elasticsearch的Java Rest Clientz
ElasticsearchRepository
优点: 简单,SpringBoot无缝对接,配置简单
缺点: 基于即将废弃的TransportClient, 不能支持复杂的业务
4.1.4 Rest Client (最后为了对原有框架的低侵入性,选择这种方案)
REST Client官方文档
Java REST Client官方API
官方给出来的REST Client有Java Low Level REST Client和Java Hight Level REST Client两个,前者兼容所有版本的ES,后者是基于前者开发出来的,只暴露了部分API,待完善。这个案例中使用Java Low Level REST Client,有如下的一些特点:
- 最小化依赖;
- 提供跨所有可用节点的负载平衡;
- 提供节点故障和特定响应代码时的故障转移;
- 提供失败重连的惩罚机制(是否对一个连接失败的节点尝试重连,取决于它连续失败的次数,尝试重连且失败的次数越多,客户端在再次尝试重连这个节点时等的时间就越长。说那么多,太复杂了,其实给一个场景就是:我找你玩儿,你不答应,我伤自尊了,下次去找你我隔了一个星期再去找你,你又不答应,我又伤自尊了,下次再找你的话,那我就隔两个星期,依次类推);
- 持久连接;
- 跟踪请求和响应的日志记录;
- 可选的集群节点自动发现功能;
官方推这个REST Client,个人还是觉得是因为它是基于HTTP端口去通信的,便于操作,而且跟ES版本几乎没有关系。
image.pngelasticsearch-rest-client Maven 仓库(5.6以上版本)
elasticsearch.client rest Maven仓库(5.0~5.5版本)
【注】此处的版本和安装的es集群的版本一致
连接es5.5 成功
使用org.elasticsearch.client5.51版本,(使用5.6版本也可以,其他版本自行测试)
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/rest -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.5.1</version>
</dependency>
【注】注意使用REST Client连接的是9200端口
public class RestClientTest {
public static void main(String[] args) {
// 步骤一:创建 RestClient 对象
RestClient restClient = RestClient.builder(new HttpHost("公网地址", 9200)).build();
// 步骤二:发起请求
try {
//index a document 往ES索引增加一条数据
HttpEntity entity = new NStringEntity("{\n\"book_id\":\"0001\",\n\"name\":\"Alice in Wonderland\"\n}",
ContentType.APPLICATION_JSON);
Response indexResponse = restClient.performRequest(
"PUT",
"/index_test/book/0001",
Collections.<String, String>emptyMap(),
entity);
//search a document 检索ES数据
Response response = restClient.performRequest("GET", "/index_test/book/0001",
Collections.singletonMap("pretty", "true"));
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意 High Level Client能够向上兼容,例如6.3.2版本的elasticsearch-rest-high-level-client能确保与大于等于6.3.2版本的Elasticsearch集群通信。为了保证最大程度地使用最新版客户端的特性,推荐High Level Client版本与集群版本一致。
网友评论