SpringBoot3整合Elasticsearch8.x之全面保姆级教程
整合ES
环境准备
- 安装配置ES:https://blog.csdn.net/qq_50864152/article/details/136724528
- 安装配置Kibana:https://blog.csdn.net/qq_50864152/article/details/136727707
- 新建项目:新建名为web的SpringBoot3项目
elasticsearch-java
公共配置
- 介绍:一个开源的高扩展的分布式全文检索引擎,可以近乎实时的存储 和检索数据
- 依赖:web模块引入elasticsearch-java依赖---但其版本必须与你下载的ES的版本一致
co.elastic.clients elasticsearch-java 8.11.1 com.fasterxml.jackson.core jackson-databind
- 配置:web模块dev目录application-dal添加
使用open+@Value("${elasticsearch.open}")的方式不能放到Nacos配置中心
# elasticsearch配置 elasticsearch: # 自定义属性---设置是否开启ES,false表不开窍ES open: true # es集群名称,如果下载es设置了集群名称,则使用配置的集群名称 clusterName: es hosts: 127.0.0.1:9200 # es 请求方式 scheme: http # es 连接超时时间 connectTimeOut: 1000 # es socket 连接超时时间 socketTimeOut: 30000 # es 请求超时时间 connectionRequestTimeOut: 500 # es 最大连接数 maxConnectNum: 100 # es 每个路由的最大连接数 maxConnectNumPerRoute: 100
- 配置:web模块config包下新建ElasticSearchConfig类
package cn.bytewisehub.pai.web.config; import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.rest_client.RestClientTransport; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Slf4j @Data @Configuration @ConfigurationProperties(prefix = "elasticsearch") public class ElasticSearchConfig { // 是否开启ES private Boolean open; // es 集群host ip 地址 private String hosts; // es用户名 private String userName; // es密码 private String password; // es 请求方式 private String scheme; // es集群名称 private String clusterName; // es 连接超时时间 private int connectTimeOut; // es socket 连接超时时间 private int socketTimeOut; // es 请求超时时间 private int connectionRequestTimeOut; // es 最大连接数 private int maxConnectNum; // es 每个路由的最大连接数 private int maxConnectNumPerRoute; // es api key private String apiKey; public RestClientBuilder creatBaseConfBuilder(String scheme){ // 1. 单节点ES Host获取 String host = hosts.split(":")[0]; String port = hosts.split(":")[1]; // The value of the schemes attribute used by noSafeRestClient() is http // but The value of the schemes attribute used by safeRestClient() is https HttpHost httpHost = new HttpHost(host, Integer.parseInt(port),scheme); // 2. 创建构建器对象 //RestClientBuilder: ES客户端库的构建器接口,用于构建RestClient实例;允许你配置与Elasticsearch集群的连接,设置请求超时,设置身份验证,配置代理等 RestClientBuilder builder = RestClient.builder(httpHost); // 连接延时配置 builder.setRequestConfigCallback(requestConfigBuilder -> { requestConfigBuilder.setConnectTimeout(connectTimeOut); requestConfigBuilder.setSocketTimeout(socketTimeOut); requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut); return requestConfigBuilder; }); // 3. HttpClient 连接数配置 builder.setHttpClientConfigCallback(httpClientBuilder -> { httpClientBuilder.setMaxConnTotal(maxConnectNum); httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute); return httpClientBuilder; }); return builder; } }
- 测试:web模块test目录下新建ElasticSearchTest类
@Slf4j @SpringBootTest public class ElasticSearchTest { @Value("${elasticsearch.open}") // 是否开启ES,默认开启 String open = "true"; }
直接连接ES
- 设置:ES Elasticsearch.yml的xpack.security.enabled属性设置为false
xpack.security.enabled:
● 默认true:必须使用账号连接ES
● 若为false:必须使用http://localhost:9200/访问ES服务+启动Kibana服务会失败+不需要使用账号连接,但必须使用HTTP连接
- 添加:ElasticSearchConfig类添加下列方法
/** * @function: 创建使用http连接来直接连接ES服务器的客户端 * 如果@Bean没有指定bean的名称,那么这个bean的名称就是方法名 */ @Bean(name = "directConnectionESClient") public ElasticsearchClient directConnectionESClient(){ RestClientBuilder builder = creatBaseConfBuilder((scheme == "http")?"http":"http"); //Create the transport with a Jackson mapper ElasticsearchTransport transport = new RestClientTransport(builder.build(), new JacksonJsonpMapper()); //And create the API client ElasticsearchClient esClient = new ElasticsearchClient(transport); return esClient; };
- 添加:ElasticSearchTest类中添加下列代码---索引名必须小写
- 运行:设置跳过测试--->手动运行/不跳过--->直接install,但不运行测试
@Resource(name = "directConnectionESClient") ElasticsearchClient directConnectionESClient; @Test public void directConnectionTest() throws IOException { if (open.equals("true")) { //创建索引 CreateIndexResponse response = directConnectionESClient.indices().create(c -> c.index("direct_connection_index")); log.info(response.toString()); } else{ log.info("es is closed"); } }
账号密码连接ES
- 设置:ES Elasticsearch.yml的xpack.security.enabled属性使用默认值+ xpack.security.http.ssl.enabled设置为false
注意:若xpack.security.enabled属性为false,则xpack.security.http.ssl.enabled属性不生效,即相当于设置为false;所有以xpack开头的属性都不会生效
ES Elasticsearch.yml的xpack.security.http.ssl.enabled:
● 默认true:必须使用https://localhost:9200/访问ES服务+启动Kibana服务会成功+需要使用账号连接+必须使用HTTPS连接
● 若为false:必须使用http://localhost:9200/访问ES服务+启动Kibana服务会失败+需要使用账号连接,但必须使用HTTP连接
- 配置:dev目录application-dal中添加下列配置
# elasticsearch配置 elasticsearch: userName: #自己的账号名 password: #自己的密码
- 添加:ElasticSearchTest类中添加下列代码---索引名必须小写+不能有空格
- 运行:设置跳过测试--->手动运行/不跳过--->直接install,但不运行测试
@Resource(name = "accountConnectionESClient") ElasticsearchClient accountConnectionESClient; @Test public void accountConnectionTest() throws IOException { if (open.equals("true")) { //创建索引 CreateIndexResponse response = accountConnectionESClient.indices().create(c -> c.index("account_connection_index")); log.info(response.toString()); } else{ log.info("es is closed"); } }
证书账号连接ES
- 设置:ES Elasticsearch.yml的xpack.security.enabled和xpack.security.http.ssl.enabled配置项使用默认值
设置为true后,ES就走https,若scheme为http,则报Unrecognized SSL message错误
- 配置:将dev目录application-dal中elasticsearch.scheme配置项改成https
- 证书添加:终端输入keytool -importcert -alias es_https_ca -keystore "D:\computelTool\Java\JDK\JDK21\lib\security\cacerts" -file "D:\computelTool\database\elasticsearch8111\config\certs\http_ca.crt"
keytool -delete -alias es_https_ca -keystore "D:\computelTool\Java\JDK\JDK21\lib\security\cacerts" ---与上面的命令相反
- 拷贝:将ESconfig目录下certs目录下的http_ca.crt文件拷贝到web模块resource目录
- 添加:ElasticSearchConfig类添加下列方法
/** * @function: 创建用于安全连接(证书 + 账号)ES服务器的客户端 * 如果@Bean没有指定bean的名称,那么这个bean的名称就是方法名 */ @Bean(name = "accountAndCertificateConnectionESClient") public ElasticsearchClient accountAndCertificateConnectionESClient() { RestClientBuilder builder = creatBaseConfBuilder( (scheme == "https")?"https":"https"); // 1.账号密码的配置 //CredentialsProvider: 用于提供 HTTP 身份验证凭据的接口; 允许你配置用户名和密码,以便在与服务器建立连接时进行身份验证 CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); // 2.设置自签证书,并且还包含了账号密码 builder.setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder .setSSLContext(buildSSLContext()) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .setDefaultCredentialsProvider(credentialsProvider)); RestClientTransport transport = new RestClientTransport(builder.build(), new JacksonJsonpMapper()); //And create the API client ElasticsearchClient esClient = new ElasticsearchClient(transport); return esClient; } private static SSLContext buildSSLContext() { // 读取http_ca.crt证书 ClassPathResource resource = new ClassPathResource("http_ca.crt"); SSLContext sslContext = null; try { // 证书工厂 CertificateFactory factory = CertificateFactory.getInstance("X.509"); Certificate trustedCa; try (InputStream is = resource.getInputStream()) { trustedCa = factory.generateCertificate(is); } // 密钥库 KeyStore trustStore = KeyStore.getInstance("pkcs12"); trustStore.load(null, "liuxiansheng".toCharArray()); trustStore.setCertificateEntry("ca", trustedCa); SSLContextBuilder sslContextBuilder = SSLContexts.custom() .loadTrustMaterial(trustStore, null); sslContext = sslContextBuilder.build(); } catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) { log.error("ES连接认证失败", e); } return sslContext; }
- 测试:ElasticSearchTest类添加
@Resource(name = "accountAndCertificateConnectionESClient") ElasticsearchClient accountAndCertificateConnectionESClient; @Test public void accountAndCertificateConnectionTest() throws IOException { if (open.equals("true")) { //创建索引 CreateIndexResponse response = accountAndCertificateConnectionESClient.indices().create(c -> c.index("account_and_certificate_connection_index")); log.info(response.toString()); System.out.println(response.toString()); } else{ log.info("es is closed"); } }
Spring Data ES
公共配置
- 依赖:web模块引入该依赖---但其版本必须与你下载的ES的版本一致
版本:点击https://spring.io/projects/spring-data-elasticsearch#learn,点击GA版本的Reference Doc,点击version查看Spring Data ES与ES版本的支持关系
参考:https://www.yuque.com/itwanger/vn4p17/wslq2t/https://blog.csdn.net/qq_40885085/article/details/105023026
org.springframework.boot spring-boot-starter-data-elasticsearch jakarta.servlet jakarta.servlet-api 6.0.0 provided org.projectlombok lombok provided
- 新建:web模块TestEntity目录新建ESTestEntity
@Data @EqualsAndHashCode(callSuper = false) @Document(indexName = "test") public class ESTestEntity implements Serializable { private static final long serialVersionUID = 1L; @Id private Long id; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String content; private String title; private String excerpt; }
- 新建:web模块TestRepository包下新建ESTestRepository 接口
import cn.bytewisehub.pai.web.TestEntity.ESTestEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface ESTestRepository extends ElasticsearchRepository { }
直接连接ES
- 配置:ES Elasticsearch.yml的xpack.security.enabled属性设置为false
xpack.security.enabled:
● 默认true:必须使用账号连接ES
● 若为false:必须使用http://localhost:9200/访问ES服务+启动Kibana服务会失败+不需要使用账号连接,但必须使用HTTP连接
- 配置:web模块dev目录application-dal添加
spring: elasticsearch: uris: - http://127.0.0.1:9200
- 新建:web模块test目录新建ElasticsearchTemplateTest
import cn.bytewisehub.pai.web.TestEntity.ESTestEntity; import cn.bytewisehub.pai.web.TestRepository.ESTestRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; @SpringBootTest public class ElasticsearchTemplateTest { @Autowired ESTestRepository esTestRepository; @Autowired ElasticsearchTemplate elasticsearchTemplate; @Test void save() { ESTestEntity esTestEntity = new ESTestEntity(); esTestEntity.setId(1L); esTestEntity.setContent("不安全连接"); esTestEntity.setTitle("world"); esTestEntity.setExcerpt("test"); System.out.println(elasticsearchTemplate.save(esTestEntity)); } @Test void insert() { ESTestEntity esTestEntity = new ESTestEntity(); esTestEntity.setId(2L); esTestEntity.setContent("不安全连接"); esTestEntity.setTitle("world"); esTestEntity.setExcerpt("test"); System.out.println(esTestRepository.save(esTestEntity)); } }
HTTP连接ES
- 配置:ES Elasticsearch.yml的xpack.security.enabled属性使用默认值+ xpack.security.http.ssl.enabled设置为false
ES Elasticsearch.yml的xpack.security.http.ssl.enabled:
● 默认true:必须使用https://localhost:9200/访问ES服务+启动Kibana服务会成功+需要使用账号连接+必须使用HTTPS连接
● 若为false:必须使用http://localhost:9200/访问ES服务+启动Kibana服务会失败+需要使用账号连接,但必须使用HTTP连接
- 配置:web模块dev目录application-dal添加
spring: elasticsearch: uris: - http://127.0.0.1:9200 username: # 账号用户名 password: #账号密码
- 修改:web模块test目录下ElasticsearchTemplateTest修改成这样,其他参见直接连接
import cn.bytewisehub.pai.web.TestEntity.ESTestEntity; import cn.bytewisehub.pai.web.TestRepository.ESTestRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; @SpringBootTest public class ElasticsearchTemplateTest { @Autowired ESTestRepository esTestRepository; @Autowired ElasticsearchTemplate elasticsearchTemplate; @Test void save() { ESTestEntity esTestEntity = new ESTestEntity(); esTestEntity.setId(1L); esTestEntity.setContent("不安全连接"); esTestEntity.setTitle("world"); esTestEntity.setExcerpt("test"); System.out.println(elasticsearchTemplate.save(esTestEntity)); } @Test void insert() { ESTestEntity esTestEntity = new ESTestEntity(); esTestEntity.setId(2L); esTestEntity.setContent("不安全连接"); esTestEntity.setTitle("world"); esTestEntity.setExcerpt("test"); System.out.println(esTestRepository.save(esTestEntity)); } }
- 访问:点击http://localhost:9200/test/_search ---查询索引库test
HTTPS连接ES
- 配置:ES Elasticsearch.yml的xpack.security.enabled和xpack.security.http.ssl.enabled属性使用默认值
- 配置:web模块dev目录application-dal添加
spring: elasticsearch: uris: - https://127.0.0.1:9200 username: # 账号用户名 password: #账号密码
- 修改:web模块test目录下ElasticsearchTemplateTest修改成这样,其他参见直接连接
import cn.bytewisehub.pai.web.TestEntity.ESTestEntity; import cn.bytewisehub.pai.web.TestRepository.ESTestRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate; @SpringBootTest public class ElasticsearchTemplateTest { @Autowired ESTestRepository esTestRepository; @Autowired ElasticsearchTemplate elasticsearchTemplate; @Test void save() { ESTestEntity esTestEntity = new ESTestEntity(); esTestEntity.setId(1L); esTestEntity.setContent("不安全连接"); esTestEntity.setTitle("world"); esTestEntity.setExcerpt("test"); System.out.println(elasticsearchTemplate.save(esTestEntity)); } @Test void insert() { ESTestEntity esTestEntity = new ESTestEntity(); esTestEntity.setId(2L); esTestEntity.setContent("不安全连接"); esTestEntity.setTitle("world"); esTestEntity.setExcerpt("test"); System.out.println(esTestRepository.save(esTestEntity)); } }
- 访问:点击http://localhost:9200/test/_search ---查询索引库test