赞
踩
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
的版本一致<!-- 若不存在Spring Data ES的某个版本支持你下的ES版本,则使用 -->
<!-- ES 官方提供的在JAVA环境使用的依赖 -->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.11.1</version>
</dependency>
<!-- 和第一个依赖是一起的,为了解决springboot项目的兼容性问题 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
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
SSLmessage
错误
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
<!-- 若存在Spring Data ES的某个版本支持你下的ES版本,则使用 --> <!-- Spring官方在ES官方提供的JAVA环境使用的依赖的基础上做了封装 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <!-- ESTestEntity用到 --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <!-- ESTestEntity用到 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> <!--provided:指定该依赖项在编译时是必需的,才会生效, 但在运行时不需要,也不会生效--> <!--这样 Lombok 会在编译期静悄悄地将带 Lombok 注解的源码文件正确编译为完整的 class 文件 --> </dependency>
we
b模块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<ESTestEntity, Long> {
}
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://localhost:9200/test/_search
---
查询索引库test
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。