Springboot整合RestHighLevelClient进行Elasticsearch操作,基于6.3.2版本,6.1.1测试通过(辛酸踩坑历史及经验分享)

说一下写这篇文章的原因,有点小复杂。

1.公司的es版本是6.1.1.禁用了9300的transport端口,只开放了rest端口. 我的springboot项目版本是2.2.0.

2.一开始兴致勃勃使用了springdata starter es,觉得就这么完事了。跑起来完全不报错,结果一来个简单查询就给我报错了,报的是查询参数多了,es当前版本并不支持该参数,不就是http请求吗?多传个参数你就挂了....

3.然后开始看springboot starter如何使用6.1.1的es,结果需要降springboot版本到2.0,我降了。然而发现6.1.1版本整合的是transportclient,需要开放transport端口,然而公司这个端口已被禁用,小开发,管不了。无疾而终。

4.于是发现了jest的一个项目,可以将9200伪装成一个es node节点,从而整合springdata es,于是使用9200接入了需要9300端口的spring data es,至此6.1.1的es整合就结束了,已经让我可以对es进行一些操作了。

5.然而这就完事了吗?我发现我太天真了。spring data es对映射实体限制的很死。我们的表索引名是存放在某张表里的,这张表每15分钟更新一次,我需要从这张表获取真实的索引表,再去查该索引表的数据。我发现es完全实现不了。

6.由于该需求,我发现es完全满足不了我的需求。又害我白白降了springboot版本。于是我决定不用它了。自己使用RestHighLevelClient对es进行定制化操作。

7.新的坑又来啦,springdata es在6.1.1使用transport连接es是有原因的:官方sdk并不完善,连创建索引的api都没有。这时候我试着去看更高版本的resthighlevelclient,发现6.2.4支持了索引的添加,但是又不支持mapping和setting的修改。我又往6.3.2的sdk看了一下,发现该sdk才支持这两个修改。

8.于是我小心翼翼的把sdk版本升到6.3.2,然后来操作我6.1.1的es.万幸!!!所有我需要使用的操作,都测试通过,完美!!!踩坑结束。

9.最后发现最高只能升到6.3.再往后就不支持了,能用就用吧,话说如果有同样使用低版本的es使用者,有新坑希望可以一起交流交流。

 

总结一下我的踩坑经验:

1.千万不要用低版本的es,有坑,有巨坑!!!

2.如果非要用,最好用spring data es支持restclient连接的版本,注意版本和spring boot的适配。然而正常人不可能因为一个es就换springboot版本,升级或者降级,如果你不想升降级springboot,那就用官方sdk ->resthighlevelclient,不就自己封装一下,也没有多难,对不对?spring data starter es和es还有springboot真的是强版本关联,真的太坑了。

3.关于sdk的问题,sdk随着版本升级,每次升级越来越完善,低版本的sdk简直简陋到不要不要的。如果你当前的操作sdk不支持,试着去看高版本的sdk的api,实现完之后,记得写测试用例测多几遍,因为有版本兼容问题,官网描述的,像我就把自己所有的操作都写了单元测试,升级完sdk,就每个都走一遍,全部通过就升,不解释。

4.spring data es真的有毒,很多局限,巨多局限,如果你要进行索引表的增删改查,使用RestHighLevelClient吧!,如果两者都要用,那就用spring data es,从bean Factory中获取对象操作吧。相信我,你会有很多增删改查索引表的场景的。

5.在准备使用get index api的时候,发现6.3.2客户端不支持,需要升级到6.4.3. 经测试,6.1.1的es最多只能使用6.3.2的客户端。升级到6.4.3版本客户端失败,问题出在RequestConverter,该类在参数里面放置了masterTimeout,导致请求不适配,除非重写把该类和包名完整拷贝出来,删除多余的参数,覆盖(重写)这个类。但是感觉没有必要,es一升级,这个类可能又得重新改,极其麻烦。这时候发现了低level的client的作用了,我们可以使用RestClient自定义实现该功能。这个restClient可以完全自己定义。不过实现高级的功能也许有点麻烦,这里只是简单实现get index api就行了。在通用template有示例代码。

废话不多说了,下面是整合的记录。

一.maven配置

<properties>
		<elasticsearch.version>6.3.2</elasticsearch.version>
</properties>
<dependencies>
        <dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-client</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>
<dependencies>

二.配置类

package com.mytest.test.config;

import org.apache.commons.lang3.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

/**
 * ElasticsearchConfig
 *
 * @author lxx
 * @date 2019/11/11
 */
@Configuration
@Slf4j
public class ElasticsearchConfig implements FactoryBean<RestHighLevelClient>, InitializingBean, DisposableBean {

    @Value("${mytest.elasticsearch.rest.uri}")
    private String uri;

    //Java Low Level REST Client (要想使用高版本client必须依赖低版本的client)
    private RestClient client;
    //Java High Level REST Client (高版本client)
    private RestHighLevelClient restHighLevelClient;

    //初始化client
    protected void initClient() {
        if(StringUtils.isEmpty(uri)){
            throw new RuntimeException("elasticsearch uri is unset to properties file");
        }
        String [] nodes = uri.split(",");
        HttpHost [] httpHosts = new HttpHost[nodes.length];
        for(int x = 0;x<nodes.length;x++){
            String [] uris = nodes[x].split(":");
            HttpHost httpHost = new HttpHost(uris[0],Integer.parseInt(uris[1]),"http");
            httpHosts[x] = httpHost;
        }
        RestClientBuilder restClientBuilder = RestClient.builder(httpHosts);
        restClientBuilder.setMaxRetryTimeoutMillis(3500);//设置http客户请求时长
        restHighLevelClient = new RestHighLevelClient(restClientBuilder);
        client = restHighLevelClient.getLowLevelClient();
//        账号密码的方式
//        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值