diff --git a/pom.xml b/pom.xml index 9b72103fc..f3abbf70e 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,8 @@ 1.8.7 2.5.12 + 3.0.2 + 7.17.28 2.0.0-M6 @@ -325,6 +327,24 @@ ${mica-mqtt.version} + + org.dromara.easy-es + easy-es-boot-starter + ${easy-es.version} + + + + co.elastic.clients + elasticsearch-java + ${elasticsearch-client.version} + + + + org.elasticsearch.client + elasticsearch-rest-client + ${elasticsearch-client.version} + + me.zhyd.oauth diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index beab6585f..8c9f26c19 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -282,6 +282,52 @@ mqtt.client: truststore-path: truststore-pass: +--- # elasticsearch 功能配置 +# 文档地址: https://www.easy-es.cn/ +# 更改包名需要去 EasyEsConfiguration 修改包扫描(后续版本支持配置文件读取) +easy-es: + # 是否开启EE自动配置 + enable: false + # 兼容模式 + compatible: true + # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开 + address: localhost:9200 + # 默认为http + schema: http + # 注意ES建议使用账号认证 不使用会报警告日志 + # 如果无账号密码则可不配置此行 + # username: + # 如果无账号密码则可不配置此行 + # password: + # 心跳策略时间 单位:ms + keep-alive-millis: 18000 + # 连接超时时间 单位:ms + connectTimeout: 5000 + # 通信超时时间 单位:ms + socketTimeout: 5000 + # 连接请求超时时间 单位:ms + connectionRequestTimeout: 5000 + # 最大连接数 单位:个 + maxConnTotal: 100 + # 最大连接路由数 单位:个 + maxConnPerRoute: 100 + global-config: + # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能 + print-dsl: true + # 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快 + asyncProcessIndexBlocking: true + db-config: + # 是否开启下划线转驼峰 默认为false + map-underscore-to-camel-case: true + # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成 + id-type: customize + # 字段更新策略 默认为not_null + field-strategy: not_null + # 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响. + enable-track-total-hits: true + # 数据刷新策略,默认为不刷新 + refresh-policy: immediate + --- # MCP 服务端配置 spring.ai.mcp: server: diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index fb14db339..17e22d37c 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -30,6 +30,7 @@ ruoyi-common-satoken ruoyi-common-security ruoyi-common-sms + ruoyi-common-elasticsearch ruoyi-common-web ruoyi-common-translation ruoyi-common-sensitive diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 809474e19..cba9a6f03 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -103,6 +103,13 @@ ${revision} + + + org.dromara + ruoyi-common-elasticsearch + ${revision} + + org.dromara diff --git a/ruoyi-common/ruoyi-common-elasticsearch/pom.xml b/ruoyi-common/ruoyi-common-elasticsearch/pom.xml new file mode 100644 index 000000000..a7332817d --- /dev/null +++ b/ruoyi-common/ruoyi-common-elasticsearch/pom.xml @@ -0,0 +1,24 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-elasticsearch + + + ruoyi-common-elasticsearch ES搜索引擎服务 + + + + + org.dromara.easy-es + easy-es-boot-starter + + + diff --git a/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/common/elasticsearch/config/ActuatorEnvironmentPostProcessor.java b/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/common/elasticsearch/config/ActuatorEnvironmentPostProcessor.java new file mode 100644 index 000000000..e33a67edc --- /dev/null +++ b/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/common/elasticsearch/config/ActuatorEnvironmentPostProcessor.java @@ -0,0 +1,26 @@ +package org.dromara.common.elasticsearch.config; + +import org.springframework.boot.EnvironmentPostProcessor; +import org.springframework.boot.SpringApplication; +import org.springframework.core.Ordered; +import org.springframework.core.env.ConfigurableEnvironment; + +/** + * 健康检查配置注入 + * + * @author Lion Li + */ +public class ActuatorEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered { + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + String enable = environment.getProperty("easy-es.enable", "false"); + System.setProperty("management.health.elasticsearch.enabled", enable); + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } + +} diff --git a/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/common/elasticsearch/config/EasyEsConfiguration.java b/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/common/elasticsearch/config/EasyEsConfiguration.java new file mode 100644 index 000000000..ceb9c2bfe --- /dev/null +++ b/ruoyi-common/ruoyi-common-elasticsearch/src/main/java/org/dromara/common/elasticsearch/config/EasyEsConfiguration.java @@ -0,0 +1,17 @@ +package org.dromara.common.elasticsearch.config; + +import org.dromara.easyes.spring.annotation.EsMapperScan; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; + +/** + * easy-es 配置 + * + * @author Lion Li + */ +@AutoConfiguration +@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true") +@EsMapperScan("org.dromara.**.esmapper") +public class EasyEsConfiguration { + +} diff --git a/ruoyi-common/ruoyi-common-elasticsearch/src/main/resources/META-INF/spring.factories b/ruoyi-common/ruoyi-common-elasticsearch/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..1a18290aa --- /dev/null +++ b/ruoyi-common/ruoyi-common-elasticsearch/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.env.EnvironmentPostProcessor=\ + org.dromara.common.elasticsearch.config.ActuatorEnvironmentPostProcessor diff --git a/ruoyi-common/ruoyi-common-elasticsearch/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-elasticsearch/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..b1a5918ec --- /dev/null +++ b/ruoyi-common/ruoyi-common-elasticsearch/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.elasticsearch.config.EasyEsConfiguration diff --git a/ruoyi-modules/ruoyi-demo/pom.xml b/ruoyi-modules/ruoyi-demo/pom.xml index 847c7d6bf..f3800ccda 100644 --- a/ruoyi-modules/ruoyi-demo/pom.xml +++ b/ruoyi-modules/ruoyi-demo/pom.xml @@ -88,6 +88,11 @@ ruoyi-common-encrypt + + org.dromara + ruoyi-common-elasticsearch + + org.dromara ruoyi-common-push diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java new file mode 100644 index 000000000..d3a154801 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/EsCrudController.java @@ -0,0 +1,89 @@ +package org.dromara.demo.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.demo.domain.Document; +import org.dromara.demo.esmapper.DocumentMapper; +import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 搜索引擎 crud 演示案例 + * + * @author Lion Li + */ +@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true") +@RequiredArgsConstructor +@RestController +@RequestMapping("/es") +public class EsCrudController { + + private final DocumentMapper documentMapper; + + /** + * 查询(指定) + * + * @param title 标题 + */ + @GetMapping("/select") + public Document select(String title) { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.eq(Document::getTitle, title); + return documentMapper.selectOne(wrapper); + } + + /** + * 搜索(模糊) + * + * @param key 搜索关键字 + */ + @GetMapping("/search") + public List search(String key) { + LambdaEsQueryWrapper wrapper = new LambdaEsQueryWrapper<>(); + wrapper.like(Document::getTitle, key); + return documentMapper.selectList(wrapper); + } + + /** + * 插入 + */ + @PostMapping("/insert") + public Integer insert(@RequestBody Document document) { + return documentMapper.insert(document); + } + + /** + * 更新 + */ + @PutMapping("/update") + public R update(@RequestBody Document document) { + // 测试更新 更新有两种情况 分别演示如下: + // case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询) + documentMapper.updateById(document); + + // case2: id未知, 根据条件更新 +// LambdaEsUpdateWrapper wrapper = new LambdaEsUpdateWrapper<>(); +// wrapper.like(Document::getTitle, document.getTitle()); +// Document document2 = new Document(); +// document2.setTitle(document.getTitle()); +// document2.setContent(document.getContent()); +// documentMapper.update(document2, wrapper); + + return R.ok(); + } + + /** + * 删除 + * + * @param id 主键 + */ + @DeleteMapping("/delete/{id}") + public R delete(@PathVariable String id) { + // 测试删除数据 删除有两种情况:根据id删或根据条件删 + return R.ok(documentMapper.deleteById(id)); + } + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java new file mode 100644 index 000000000..f9f06dda6 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/Document.java @@ -0,0 +1,26 @@ +package org.dromara.demo.domain; + +import lombok.Data; + +/** + * 文档实体 + */ +@Data +public class Document { + + /** + * es中的唯一id + */ + private String id; + + /** + * 文档标题 + */ + private String title; + + /** + * 文档内容 + */ + private String content; + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java new file mode 100644 index 000000000..63c982366 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/esmapper/DocumentMapper.java @@ -0,0 +1,7 @@ +package org.dromara.demo.esmapper; + +import org.dromara.demo.domain.Document; +import org.dromara.easyes.core.kernel.BaseEsMapper; + +public interface DocumentMapper extends BaseEsMapper { +}