第一是为了记录采坑。
第二是为了“同道中人”,少走弯路!
一、注意你的ES版本,版本,版本【重要的事情说三遍!】
SpringBoot的ES依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
记得没错此依赖只针对的是6.0版本以上ES,6.0版本以下ES不适用于SpringBoot的依赖。
举例:我们公司的线上ES版本为5.4.2,但是我刚开始集成的时候,使用了SpringBoot的依赖配置信息如下
spring:
cluster-nodes: 公司ES的IP地址,注意端口号不是9200而是9300!!
cluster-name: 这是你的ES的名称,打开ES页面后"cluster_name"参数的值
elasticsearch:
repositories:
enabled: true
导致在启动后,报错无法找到ES,None of the configured nodes are available。哎,这个问题坑死!!!只要你仔细核对了cluster-nodes参数,cluster-name参数没有问题,那绝对是版本问题,你需要自己手动配置依赖!
公司的ES版本为5.4.2你的依赖就要是
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.4.2</version>
</dependency>
<!-- 尤其是要注意这里!下面的三个依赖,需要你打开ES页面,
查看lucene_version参数的版本,要一一对应!!!! -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>6.5.1</version>
</dependency>
<!-- https://mvnrepository.com/art... -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>6.5.1</version>
</dependency>
<!-- https://mvnrepository.com/art... -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queries</artifactId>
<version>6.5.1</version>
</dependency>
另附一个图:
总结:个人建议还是自己老老实实配比较好,不要去用SpringBoot的ES依赖。。除非你的版本比较高吧。。。
-------------------------------分隔符------------------------------------
后面找到了一个兼容ES5、ES6的工具,叫Jest。具体如何使用可以看我另一篇文章:Java连接操作ElasticSearch工具类(含ES装了SQL插件的方式 支持5.0+6.0+)
-------------------------------分隔符------------------------------------
二、接着上面我说的自己配依赖的问题的坑!
确实自己配依赖是繁琐了点,但是在用SpringBoot的依赖,是越跑越远。。。。
自己配依赖也遇到了个坑。。。。
上面说的那4个自己配的依赖,copy到不同的项目中,版本号会自动变???!!!
怎么发现这个问题的呢,因为我自己手写了一个ES的配置类:
package com.es.util;
import java.net.InetAddress;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
public class EsClient {
public final static String HOST = "127.0.0.1";
public TransportClient client = null;
public final static int PORT = 9300;
/**
* 获取客户端连接信息
*
* @return void
* @Title: getConnect
*/
@SuppressWarnings({"resource", "unchecked"})
public void getConnect() {
try {
//如果使用集群名称不是默认的“elasticsearch”,则必须设置集群名称, 通过对Settings经行设置
/*Settings settings = Settings.builder()
.put("cluster.name", "elasticsearch").build();*/
/*TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName(HOST), PORT));
client.close();*/
TransportClient client = null;
PreBuiltTransportClient preBuiltTransportClient = null;
// 设置集群名称
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
// 创建client
preBuiltTransportClient = new PreBuiltTransportClient(settings);
client = preBuiltTransportClient
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(HOST), 9300));
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 关闭连接
*
* @return void
* @Title: closeConnect
*/
public void closeConnect() {
if (null != client) {
client.close();
}
}
public static void main(String[] args) {
EsClient esClient = new EsClient();
esClient.getConnect();
}
}
在SpringBoot项目中,我复制过来Maven的Demo代码时,InetSocketTransportAddress类,爆红了。
百度了一番知道,在6.0以上版本中,InetSocketTransportAddress类被删除了,不在使用它创建链接了,而是使用TransportAddress类。
好的,知道了,但是为什么依赖一模一样,我的版本设置的是5.4.2。。。在SpringBoot中自动变成了6.0呢,一度有点觉得不可能,因为我是指定版本,并没有用starter。。但是百度也没有找到答案,所以我个人理解,可能是因为相同的依赖SpringBoot会识别到,他们那里有,就不去Maven仓库下载了。不这么想会一晚上睡不着。。所以有朋友知道为什么,也可以告我一下,谢谢
解决办法:将自己的ES依赖,先弄出来,再一键导入的SpringBoot项目中,也就说,我不写什么dependency了,我自己导入JAR,你管得着我吗??哈哈。。。。但是确实累!59个jar。。我去。。。
另附一个下载JAR的链接:
https://download.csdn.net/download/remember__peng/11633909
所有6.0以下版本的ES都可以使用,全部导入项目中,并把上面那个工具类复制下来即可。