diff --git a/pom.xml b/pom.xml
index 076179832..a1b02fd23 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,6 +32,8 @@
0.9.1
3.5.10.1
5.8.36
+ 8.17.4
+ 2.1.1
9.0.98
1.2.13
@@ -248,6 +250,24 @@
${aliyun-sdk-oss.version}
+
+
+ co.elastic.clients
+ elasticsearch-java
+ ${elasticsearch.version}
+
+
+ org.elasticsearch.client
+ elasticsearch-rest-client
+ ${elasticsearch.version}
+
+
+ jakarta.json
+ jakarta.json-api
+ ${jakarta.json-api.version}
+
+
+
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 85317eb20..f67d0b761 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -22,7 +22,14 @@ oss:
roleArn: acs:ram::1919425406190533:role/sts-role
expiredDuration: 3600
tempDir: E:/temp/
-
+es:
+ #多个用","分割
+ hosts: 49.234.41.39:9222
+ ssl: false
+ username: elastic
+ password: eguMAH-Fg*dPETkgJTkD
+ maxConnTotal: 4
+ maxConnPerRoute: 2
# 开发环境配置
server:
# 服务器的HTTP端口,默认为9310
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 87a79d9d6..79bd346a9 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -122,6 +122,12 @@
spring-boot-starter-data-redis
+
+
+ co.elastic.clients
+ elasticsearch-java
+
+
org.apache.commons
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/EsAutoConfiguration.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/EsAutoConfiguration.java
new file mode 100644
index 000000000..c3725d89a
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/EsAutoConfiguration.java
@@ -0,0 +1,30 @@
+package com.ruoyi.framework.config;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.ruoyi.framework.config.properties.EsProperties;
+import com.ruoyi.framework.es.EsClientWrapper;
+import com.ruoyi.framework.es.EsConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author liangyq
+ * @date 2025-03-24
+ */
+@Configuration
+@ConditionalOnClass(EsClientWrapper.class)
+@ConditionalOnProperty("es.hosts")
+@EnableConfigurationProperties(EsProperties.class)
+public class EsAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ public EsClientWrapper esClient(EsProperties properties) {
+ EsConfiguration config = BeanUtil.toBean(properties, EsConfiguration.class);
+ return new EsClientWrapper(config);
+ }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/EsProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/EsProperties.java
new file mode 100644
index 000000000..848e2d8fc
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/EsProperties.java
@@ -0,0 +1,26 @@
+package com.ruoyi.framework.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author liangyq
+ * @date 2025-03-24
+ */
+@Data
+@ConfigurationProperties(prefix = "es")
+public class EsProperties {
+
+ private String hosts;
+
+ private boolean ssl;
+
+ private String username;
+
+ private String password;
+
+ private int maxConnTotal;
+
+ private int maxConnPerRoute;
+
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/es/EsClientWrapper.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/es/EsClientWrapper.java
new file mode 100644
index 000000000..4d5ddac01
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/es/EsClientWrapper.java
@@ -0,0 +1,67 @@
+package com.ruoyi.framework.es;
+
+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.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;
+
+/**
+ * @author liangyq
+ * @date 2025-03-28 10:36
+ */
+@Slf4j
+public class EsClientWrapper {
+
+ private final RestClient restClient;
+
+ private final ElasticsearchClient esClient;
+
+ public EsClientWrapper(EsConfiguration config) {
+ String[] hosts = config.getHosts().split(",");
+ String scheme = config.isSsl() ? "https" : "http";
+ HttpHost[] httpHosts = new HttpHost[hosts.length];
+ int i = 0;
+ for (String host : hosts) {
+ String[] args = host.split(":");
+ httpHosts[i++] = (new HttpHost(args[0], Integer.parseInt(args[1]), scheme));
+ }
+ RestClientBuilder clientBuilder;
+ if (null != config.getUsername() && null != config.getPassword()) {
+ clientBuilder = RestClient.builder(httpHosts).setHttpClientConfigCallback(httpClientBuilder -> {
+ httpClientBuilder.setMaxConnTotal(config.getMaxConnTotal());
+ httpClientBuilder.setMaxConnPerRoute(config.getMaxConnPerRoute());
+ CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+ credentialsProvider.setCredentials(AuthScope.ANY,
+ new UsernamePasswordCredentials(config.getUsername(), config.getPassword()));
+ return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
+ });
+ } else {
+ clientBuilder = RestClient.builder(httpHosts).setHttpClientConfigCallback(httpClientBuilder -> {
+ httpClientBuilder.setMaxConnTotal(config.getMaxConnTotal());
+ httpClientBuilder.setMaxConnPerRoute(config.getMaxConnPerRoute());
+ return httpClientBuilder;
+ });
+ }
+ restClient = clientBuilder.build();
+ // 使用 Jackson 映射器创建传输
+ ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
+ esClient = new ElasticsearchClient(transport);
+ }
+
+ /**
+ * 获取es客户端
+ *
+ * @return
+ */
+ public ElasticsearchClient getEsClient() {
+ return esClient;
+ }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/es/EsConfiguration.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/es/EsConfiguration.java
new file mode 100644
index 000000000..2c20ba46a
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/es/EsConfiguration.java
@@ -0,0 +1,24 @@
+package com.ruoyi.framework.es;
+
+import lombok.Data;
+
+/**
+ * @author liangyq
+ * @date 2025-03-28 10:36
+ */
+@Data
+public class EsConfiguration {
+
+ private String hosts;
+
+ private boolean ssl;
+
+ private String username;
+
+ private String password;
+
+ private int maxConnTotal;
+
+ private int maxConnPerRoute;
+
+}