Easy-Es介绍
Easy-Es是一款由国内开发者打造并完全开源的ElasticSearch-ORM框架
采用和Mybatis-Plus一致的语法设计,能够显著降低ElasticSearch搜索引擎使用门槛,和额外学习成本,并大幅减少开发者工作量,总之非常牛皮。
详细的介绍及功能 可前往官网翻阅
官网地址: Easy-Es
Spring-Boot中的使用
废话不多说,直接上代码
首先要有一个Spring-Boot项目啦,过于简单,直接跳过
Pom.xml
说明
要在Spring-Boot中排除默认的es依赖坐标,因为默认的es版本可能和Easy-Es不匹配,导致启动失败
xml
<properties>
<spring-boot.version>2.7.9</spring-boot.version>
<elasticsearch.version>7.14.0</elasticsearch.version>
<easy-es.version>2.0.0-beta4</easy-es.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- SpringBoot的依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>${easy-es.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
applicaton.yml
说明
Easy-Es的配置信息
yml
--- # easy-es 配置
easy-es:
enable: true # 默认为true,若为false时,则认为不启用本框架
address: 192.168.52.130:9200 #填你的es连接地址
username: elastic
password: 123456
# 心跳策略时间 单位: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
Application启动类
说明
在启动类上添加包扫描工具
java
@SpringBootApplication
@EsMapperScan("com.an.**.esmapper")
public class AnnApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication application = new SpringApplication(AnnApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);
System.out.println("(♥◠‿◠)ノ゙ Ann-Blog-Plus启动成功 ლ(´ڡ`ლ)゙");
}
}
EsDemoMapper接口
说明
可以看到这个接口的包路径就是和包扫描对应的,接口的结构也是和MyBatis-Plus类似的,BaseEsMapper中封装了大量的方法,方便我们直接使用
java
package com.an.demo.esmapper;
import com.an.demo.domain.Document;
import org.dromara.easyes.core.core.BaseEsMapper;
/**
* Es博客文章映射器
*
* @author: ANH
* @createDate: 2024/03/10
* @version: 1.0.0
*/
public interface EsDemoMapper extends BaseEsMapper<Document> {
}
Document类
说明
实体类中也是和Mp类似,@IndexName类似于@TableName,意思是此实体类对应的索引名称,@IndexId类似于@TableId ....,不再赘述
java
package com.an.demo.domain;
import lombok.Data;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
/**
* ES数据模型
*
*
*
*
*
* Copyright © 2021 xpc1024 All Rights Reserved
*
* @author ANH
* @date 2024/06/01
*/
@Data
@IndexName("document")
public class Document {
/**
* es中的唯一id
*/
@IndexId
private String id;
/**
* 文档标题
*/
private String title;
/**
* 文档内容
*/
private String content;
private String[] tags;
}
EsDemoController类
说明
控制层中有创建索引,新增索引数据,条件查询三个接口
java
package com.an.demo.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.an.common.core.domain.R;
import com.an.demo.domain.Document;
import com.an.demo.esmapper.EsDemoMapper;
import lombok.RequiredArgsConstructor;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Es演示控制器
*
* @author: ANH
* @createDate: 2024/03/10
* @version: 1.0.0
*/
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/es")
@SaIgnore
public class EsDemoController {
private final EsDemoMapper esDemoMapper;
/**
* 创建索引
*
* @return {@link R }
* @author: ANH
* @createDate: 2024/03/10
* @version: 1.0.0
*/
@GetMapping("/createIndex")
public R createIndex() {
esDemoMapper.createIndex();
return R.ok();
}
/**
* 加
*
* @return {@link R }
* @author ANH
* @date 2024/06/01
*/
@GetMapping("/addByEasyEs")
public R add() {
List documents = buildData();
Integer i = esDemoMapper.insertBatch(documents);
return R.ok(i);
}
private List buildData() {
List documents = new ArrayList();
// 创建第一条数据
Document document1 = new Document();
document1.setId("124");
document1.setContent("这是第二篇博客的内容");
String[] tags1 = {"python", "数据分析", "机器学习"};
document1.setTags(tags1);
// 创建第二条数据
Document document2 = new Document();
document2.setId("125");
document2.setContent("今天天气真好,适合出去运动");
String[] tags2 = {"健身", "跑步", "户外运动"};
document2.setTags(tags2);
// 创建第三条数据
Document document3 = new Document();
document3.setId("126");
document3.setContent("新产品发布会即将召开,敬请期待");
String[] tags3 = {"新品", "发布会", "科技"};
document3.setTags(tags3);
// 创建第四条数据
Document document4 = new Document();
document4.setId("127");
document4.setContent("明天放假了,准备去旅行放松一下");
String[] tags4 = {"度假", "旅游", "休闲"};
document4.setTags(tags4);
documents.add(document1);
documents.add(document2);
documents.add(document3);
documents.add(document4);
return documents;
}
/**
* 选择列表
*
* @return {@link R }
* @author ANH
* @date 2024/06/01
*/
@GetMapping("/selectListByEasyEs")
public R selectList() {
List list = Arrays.asList("度假", "科技");
LambdaEsQueryWrapper esQueryWrapper = new LambdaEsQueryWrapper()
.in(Document::getTags, list).and(wr->wr.like(Document::getContent,"放假"));
List documents = esDemoMapper.selectList(esQueryWrapper);
return R.ok(documents);
}
}
结果
创建索引并新增数据后
es中存在数据