diff --git a/ruoyi-example/ruoyi-demo/pom.xml b/ruoyi-example/ruoyi-demo/pom.xml
index d8c74b3d..978fe3f6 100644
--- a/ruoyi-example/ruoyi-demo/pom.xml
+++ b/ruoyi-example/ruoyi-demo/pom.xml
@@ -93,6 +93,10 @@
+
+ com.ruoyi
+ ruoyi-common-elasticsearch
+
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/EsCrudController.java b/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/EsCrudController.java
new file mode 100644
index 00000000..e53481b2
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/EsCrudController.java
@@ -0,0 +1,86 @@
+package com.ruoyi.demo.controller;
+
+import cn.easyes.core.conditions.LambdaEsQueryWrapper;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.demo.domain.Document;
+import com.ruoyi.demo.esmapper.DocumentMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 搜索引擎 crud 演示案例
+ *
+ * @author Lion Li
+ */
+@RestController
+@RequiredArgsConstructor
+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-example/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/Document.java b/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/Document.java
new file mode 100644
index 00000000..417d2ca3
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/Document.java
@@ -0,0 +1,25 @@
+package com.ruoyi.demo.domain;
+
+import lombok.Data;
+
+/**
+ * 文档实体
+ */
+@Data
+public class Document {
+
+ /**
+ * es中的唯一id
+ */
+ private String id;
+
+ /**
+ * 文档标题
+ */
+ private String title;
+
+ /**
+ * 文档内容
+ */
+ private String content;
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/esmapper/DocumentMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/esmapper/DocumentMapper.java
new file mode 100644
index 00000000..b924afb1
--- /dev/null
+++ b/ruoyi-example/ruoyi-demo/src/main/java/com/ruoyi/demo/esmapper/DocumentMapper.java
@@ -0,0 +1,7 @@
+package com.ruoyi.demo.esmapper;
+
+import cn.easyes.core.conditions.interfaces.BaseEsMapper;
+import com.ruoyi.demo.domain.Document;
+
+public interface DocumentMapper extends BaseEsMapper {
+}
diff --git a/ruoyi-example/ruoyi-demo/src/main/resources/application.yml b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml
index 850346f2..bf3a6e04 100644
--- a/ruoyi-example/ruoyi-demo/src/main/resources/application.yml
+++ b/ruoyi-example/ruoyi-demo/src/main/resources/application.yml
@@ -45,3 +45,51 @@ spring:
url: ${datasource.system-master.url}
username: ${datasource.system-master.username}
password: ${datasource.system-master.password}
+
+--- # elasticsearch 功能配置
+# 文档地址: https://www.easy-es.cn/
+# 更改包名需要去 EasyEsConfiguration 修改包扫描(后续版本支持配置文件读取)
+easy-es:
+ # 是否开启EE自动配置
+ enable: 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
+ requestTimeout: 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
+ # 是否全局开启must查询类型转换为filter查询类型 默认为false不转换
+ enable-must2-filter: false