说一下写这篇文章的原因,有点小复杂。
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();

&spm=1001.2101.3001.5002&articleId=103508417&d=1&t=3&u=04b4c808ea5f4c20824d60ab89d70a94)
4435

被折叠的 条评论
为什么被折叠?



