一直在坑自己家人,对,说的就是你,大A.
上一章简单介绍了SpringBoot整合ES 实现简单项目(七), 如果没有看过,请观看上一章
Mybatis 有增强性的 MybatisPlus, ES 有增强性的吗? 有的, easy-es
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,
在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,
您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,
在有些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.
官网地址: https://www.easy-es.cn/pages/v1.x/1cebb8/
EE的主要特性如下:
- 全自动索引托管:开发者无需关心索引的创建、更新及数据迁移等繁琐步骤,框架能自动完成。
- 屏蔽语言差异:开发者只需要会MySQL的语法即可使用ES。
- 代码量极少:与直接使用官方提供的RestHighLevelClient相比,相同的查询平均可以节省3-5倍的代码量。
- 零魔法值:字段名称直接从实体中获取,无需手写。
- 零额外学习成本: 开发者只要会国内最受欢迎的Mybatis-Plus用法,即可无缝迁移至EE。
一. SpringBoot 整合 Easy-Es
一.一 添加依赖
一.一.一 去除 spring-boot-starter-web 携带的 es 版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<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>
一.一.二 添加 easy-es 和相应的依赖
<!--引入 spring-data-elasticsearch-->
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!--添加依赖-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.14.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.14.0</version>
</dependency>
一.二 easy-es 配置 application.yml
easy-es:
enable: true
banner: false
address: localhost:9200
# 一些其它的额外配置
keep-alive-millis: 30000 # 心跳策略时间 单位:ms
connect-timeout: 5000 # 连接超时时间 单位:ms
socket-timeout: 600000 # 通信超时时间 单位:ms
request-timeout: 5000 # 请求超时时间 单位:ms
connection-request-timeout: 5000 # 连接请求超时时间 单位:ms
max-conn-total: 100 # 最大连接数 单位:个
max-conn-per-route: 100 # 最大连接路由数 单位:个
global-config:
process-index-mode: smoothly #索引处理模式,smoothly:平滑模式,默认开启此模式, not_smoothly:非平滑模式, manual:手动模式
print-dsl: true # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能
distributed: false # 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.
db-config:
map-underscore-to-camel-case: false # 是否开启下划线转驼峰 默认为false
table-prefix: # 索引前缀,可用于区分环境 默认为空 用法和MP一样
id-type: customize # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成
field-strategy: not_empty # 字段更新策略 默认为not_null
refresh-policy: immediate # 数据刷新策略,默认为不刷新
# 配置日志
logging:
level:
# # 开启trace级别日志,在开发时可以开启此配置,则控制台可以打印es全部请求信息及DSL语句,
# 为了避免重复,开启此项配置后,可以将EE的print-dsl设置为false.
tracer: trace
一.三 启动类配置扫描
使用 EsMapperScan 注解,进行配置扫描
@SpringBootApplication
@EsMapperScan("top.yueshushu.learn.esmapper")
public class EasyESApp {
public static void main(String[] args) {
SpringApplication.run(EasyESApp.class,args);
}
}
一.四 配置实体 EsUser
@Data
@IndexName("es")
public class EsUser implements Serializable {
// value 默认为 _id
@IndexId(type = IdType.CUSTOMIZE)
private Integer id;
@IndexField(strategy = FieldStrategy.NOT_EMPTY, fieldType = FieldType.TEXT, analyzer = "ik_max_word")
/**
* 需要被高亮的字段
*/
@HighLight(mappingField = "nameHighlightContent", preTag = "<font color='red'>", postTag = "</font>")
private String name;
@IndexField(strategy = FieldStrategy.NOT_EMPTY,fieldType = FieldType.TEXT, analyzer = "ik_max_word")
private String nickName;
@IndexField(fieldType = FieldType.INTEGER)
private Integer age;
@IndexField(fieldType = FieldType.KEYWORD_TEXT)
private String sex;
@Score
private Float score;
// 不存在
@IndexField(exist = false)
private String description;
// 不存在
@IndexField(exist = false)
private Integer maxAge;
@IndexField(exist = false)
private Integer minAge;
@IndexField(exist = false)
private String nameHighlightContent;
}
使用一些配置注解 @IndexName @IndexId @IndexField
一.五 配置 Mapper
继承 BaseEsMapper 接口
public interface EsUserMapper extends BaseEsMapper<EsUser> {
}
这样,基本的配置就算是处理完成了, 后续 使用 EsUserMapper 即可以操作.
二. Easy-ES 配置项和注解
二.一 配置项
二.一.一 基础配置项
easy-es:
enable: true # 是否开启EE自动配置
address : 127.0.0.1:9200 # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
schema: http # 默认为http
username: elastic #如果无账号密码则可不配置此行
password: 123456 #如果无账号密码则可不配置此行
二.一.二 扩展的连接池配置项
easy-es:
keep-alive-millis: 18000 # 心跳策略时间 单位:ms
connect-timeout: 5000 # 连接超时时间 单位:ms
socket-timeout: 5000 # 通信超时时间 单位:ms
request-timeout: 5000 # 请求超时时间 单位:ms
connection-request-timeout: 5000 # 连接请求超时时间 单位:ms
max-conn-total: 100 # 最大连接数 单位:个
max-conn-per-route: 100 # 最大连接路由数 单位:个
二.一.三 全局配置
类似于 mp 的配置处理
easy-es:
banner: false # 默认为true 打印banner 若您不期望打印banner,可配置为false
global-config:
process-index-mode: smoothly #索引处理模式,smoothly:平滑模式,默认开启此模式, not_smoothly:非平滑模式, manual:手动模式
print-dsl: true # 开启控制台打印通过本框架生成的DSL语句,默认为开启,测试稳定后的生产环境建议关闭,以提升少量性能
distributed: false # 当前项目是否分布式项目,默认为true,在非手动托管索引模式下,若为分布式项目则会获取分布式锁,非分布式项目只需synchronized锁.
async-process-index-blocking: true # 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快
active-release-index-max-retry: 60 # 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数若数据量过大,重建索引数据迁移时间超过60*(180/60)=180分钟时,可调大此参数值,此参数值决定最大重试次数,超出此次数后仍未成功,则终止重试并记录异常日志
active-release-index-fixed-delay: 180 # 分布式环境下,平滑模式,当前客户端激活最新索引最大重试次数 若数据量过大,重建索引数据迁移时间超过60*(180/60)=180分钟时,可调大此参数值 此参数值决定多久重试一次 单位:秒
db-config:
map-underscore-to-camel-case: false # 是否开启下划线转驼峰 默认为false
table-prefix: daily_ # 索引前缀,可用于区分环境 默认为空 用法和MP一样
id-type: customize # id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成
field-strategy: not_empty # 字段更新策略 默认为not_null
enable-track-total-hits: true # 默认开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响,若查询数量突破1W条时,需要同步调整@IndexName注解中的maxResultWindow也大于1w,并重建索引后方可在后续查询中生效(不推荐,建议分页查询).
refresh-policy: immediate # 数据刷新策略,默认为不刷新
enable-must2-filter: false # 是否全局开启must查询类型转换为filter查询类型 默认为false不转换
batch-update-threshold: 10000 # 批量更新阈值 默认值为1万
其中,主要的属性有 :
global-config.print-dsl: true
global-config.db-config.id-type: customize
global-config.db-config.field-strategy: not_empty
global-config.db-config.refresh-policy: immediate
- id-type支持3种类型:
- auto: 由ES自动生成,是默认的配置,无需您额外配置 推荐
- uuid: 系统生成UUID,然后插入ES (不推荐)
- customize: 用户自定义,在此类型下,用户可以将任意数据类型的id存入es作为es中的数据id,比如将mysql自增的id作为es的id,可以开启此模式,或通过@TableId(type)注解指定.
- field-strategy支持3种类型:
- not_null: 非Null判断,字段值为非Null时,才会被更新
- not_empty: 非空判断,字段值为非空字符串时才会被更新
- ignore: 忽略判断,无论字段值为什么,都会被更新
- 在配置了全局策略后,您仍可以通过注解针对个别类进行个性化配置,全局配置的优先级是小于注解配置的
- refresh-policy支持3种策略
- none: 默认策略,不刷新数据
- immediate : 立即刷新,会损耗较多性能,对数据实时性要求高的场景下适用
- wait_until: 请求提交数据后,等待数据完成刷新(1s),再结束请求 性能损耗适中
二.一.四 日志配置
logging:
level:
tracer: trace # 开启trace级别日志
二.二 注解
二.二.一 mapper 扫描注解 @EsMapperScan
位置在Springboot启动类 ,功能与MP的@MapperScan一致
@SpringBootApplication
@EsMapperScan("top.yueshushu.learn.esmapper")
public class EasyESApp {
public static void main(String[] args) {
SpringApplication.run(EasyESApp.class,args);
}
}
二.二.二 索引名注解 @IndexName
使用位置, 在 实体类上
@Data
@IndexName("es")
public class EsUser implements Serializable {
}
二.二.三 ES主键 @IndexId
使用位置:实体类中被作为ES主键的字段, 对应MP的@TableId注解
// value 默认为 _id
@IndexId(type = IdType.CUSTOMIZE)
private Integer id;
一般是用户自定义配置.
二.二.四 一般属性配置 @IndexField
实体类中被作为ES索引字段的字段
@IndexField(strategy = FieldStrategy.NOT_EMPTY,fieldType = FieldType.TEXT, analyzer = "ik_max_word")
private String nickName;
@IndexField(fieldType = FieldType.INTEGER)
private Integer age;
二.二.五 得分注解 @Score
实体类中被作为ES查询得分返回的字段
比如需要知道本次匹配查询得分有多少时,可以在实体类中添加一个类型为Float/float的字段,并在该字段上添加@Score注解,在后续查询中,若es有返回当次查询的得分,则此得分会自动映射至此字段
@Score
private Float score;
二.二.六 高亮注解 @HighLight
配置高亮信息
/**
* 需要被高亮的字段
*/
@HighLight(mappingField = "nameHighlightContent", preTag = "<font color='red'>", postTag = "</font>")
private String name;
@IndexField(exist = false)
private String nameHighlightContent;
一般会配置一下 mappingField, 这样就不会修改之前的 name 属性了.
三. 基础的操作
跟 MybatisPlus 基本是一样的, 这里就不作过多的讲解了。
三.一 单个插入和批量插入
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class BaseEsTest {
@Resource
private EsUserMapper esUserMapper;
/**
单个插入
*/
@Test
public void insertTest() {
EsUser esUser = new EsUser();
esUser.setId(1);
esUser.setName("岳泽霖");
esUser.setNickName("小泽霖");
esUser.setAge(28);
esUser.setSex("男");
esUserMapper.insert(esUser);
}
/**
批量插入
*/
@Test
public void batchInsertTest() {
EsUser esUser = new EsUser();
esUser.setId(2);
esUser.setName("岳建立");
esUser.setNickName("小建立");
esUser.setAge(25);
esUser.setSex("男");
// 批量插入
esUserMapper.insertBatch(Collections.singletonList(esUser));
}
}
三.二 查询操作
@Test
public void getByIdTest() {
EsUser esUser = esUserMapper.selectById(1);
log.info(">> 查询用户: {}",esUser );
}
@Test
public void selectAllTest() {
List<EsUser> esUserList = esUserMapper.selectList(new LambdaEsQueryWrapper<>());
esUserList.forEach(
n->{
log.info("用户信息: {}",n);
}
);
}
/**
根据id 批量查询
*/
@Test
public void getByIdsTest() {
List<EsUser> esUserList = esUserMapper.selectBatchIds(Arrays.asList(1,2));
esUserList.forEach(
n->{
log.info("用户信息: {}",n);
}
);
}
/**
查询数量
*/
@Test
public void countTest() {
Long count = esUserMapper.selectCount(new LambdaEsQueryWrapper<>());
log.info(">>> 总数是: {}", count);
}
三.三 更新操作
/**
更新操作
*/
@Test
public void updateTest() {
log.info(">>> 之前的数据是: {}" ,esUserMapper.selectById(1));
EsUser esUser = esUserMapper.selectById(1);
esUser.setAge(29);
esUser.setNickName("两个蝴蝶飞");
// 进行更新
esUserMapper.updateById(esUser);
log.info(">>> 修改后的数据是: {}" ,esUserMapper.selectById(1));
}
/**
批量更新
*/
@Test
public void batchUpdateTest() {
EsUser esUser = esUserMapper.selectById(1);
esUser.setAge(30);
esUser.setNickName("批量更新两个蝴蝶飞");
esUserMapper.updateBatchByIds(Collections.singletonList(esUser));
log.info(">>> 修改后的数据是: {}" ,esUserMapper.selectById(1));
}
/**
根据条件进行更新
*/
@Test
public void updateByWrapperTest() throws Exception{
LambdaEsUpdateWrapper<EsUser> esUserLambdaEsUpdateWrapper = new LambdaEsUpdateWrapper<>();
esUserLambdaEsUpdateWrapper.le(EsUser::getAge,300);
EsUser esUser = new EsUser();
esUser.setNickName("根据条件更新2");
esUser.setAge(33);
esUserMapper.update(esUser,esUserLambdaEsUpdateWrapper);
selectAllTest();
}
三.四 删除操作
@Test
public void deleteByIdTest() {
// 根据id 进行删除
esUserMapper.deleteById(1);
}
/**
根据id 批量删除
*/
@Test
public void deleteBatchTest() {
esUserMapper.deleteBatchIds(Collections.singletonList(2));
}
/**
根据条件批量删除
*/
@Test
public void deleteByWrapperTest() throws Exception{
LambdaEsQueryWrapper<EsUser> esUserLambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
esUserLambdaEsQueryWrapper.le(EsUser::getAge,300);
esUserMapper.delete(esUserLambdaEsQueryWrapper);
TimeUnit.SECONDS.sleep(2);
selectAllTest();
}
四. 查询操作
查询使用到 LambdaEsQueryWrapper 对象
方法基本与 mybatiplus 一致
Mysql | Easy-ES | es-DSL/es java api |
---|---|---|
and | and | must |
or | or | should |
= | eq | term |
!= | ne | boolQueryBuilder.mustNot(queryBuilder) |
> | gt | QueryBuilders.rangeQuery(‘es field’).gt() |
>= | ge | .rangeQuery(‘es field’).gte() |
< | lt | .rangeQuery(‘es field’).lt() |
<= | le | .rangeQuery(‘es field’).lte() |
like ‘%field%’ | like | QueryBuilders.wildcardQuery(field,value) |
not like ‘%field%’ | notLike | must not wildcardQuery(field,value) |
like ‘%field’ | likeLeft | QueryBuilders.wildcardQuery(field,*value) |
like ‘field%’ | likeRight | QueryBuilders.wildcardQuery(field,value*) |
between | between | QueryBuilders.rangeQuery(‘es field’).from(xx).to(xx) |
notBetween | notBetween | must not QueryBuilders.rangeQuery(‘es field’).from(xx).to(xx) |
is null | isNull | must not QueryBuilders.existsQuery(field) |
is notNull | isNotNull | QueryBuilders.existsQuery(field) |
in | in | QueryBuilders.termsQuery(" xx es field", xx) |
not in | notIn | must not QueryBuilders.termsQuery(" xx es field", xx) |
group by | groupBy | AggregationBuilders.terms() |
order by | orderBy | fieldSortBuilder.order(ASC/DESC) |
min | min | AggregationBuilders.min |
max | max | AggregationBuilders.max |
avg | avg | AggregationBuilders.avg |
sum | sum | AggregationBuilders.sum |
order by xxx asc | orderByAsc | fieldSortBuilder.order(SortOrder.ASC) |
order by xxx desc | orderByDesc | fieldSortBuilder.order(SortOrder.DESC) |
- | match | matchQuery |
- | matchPhrase | QueryBuilders.matchPhraseQuery |
- | matchPrefix | QueryBuilders.matchPhrasePrefixQuery |
- | queryStringQuery | QueryBuilders.queryStringQuery |
select * | matchAllQuery | QueryBuilders.matchAllQuery() |
- | highLight | HighlightBuilder.Field |
先批量添加, 提前准备好数据
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class SearchTest {
@Resource
private EsUserMapper esUserMapper;
@Resource
private RestHighLevelClient restHighLevelClient;
@Test
public void batchInsertTest() {
EsUser esUser1 = new EsUser();
esUser1.setId(1);
esUser1.setName("岳泽霖");
esUser1.setNickName("小泽霖");
esUser1.setAge(28);
esUser1.setSex("男");
EsUser esUser2 = new EsUser();
esUser2.setId(2);
esUser2.setName("岳建立");
esUser2.setNickName("小建立");
esUser2.setAge(26);
esUser2.setSex("男");
EsUser esUser3 = new EsUser();
esUser3.setId(3);
esUser3.setName("张三");
esUser3.setNickName("张三");
esUser3.setAge(24);
esUser3.setSex("男");
EsUser esUser4 = new EsUser();
esUser4.setId(4);
esUser4.setName("李四");
esUser4.setNickName("李四");
esUser4.setAge(24);
esUser4.setSex("女");
EsUser esUser5 = new EsUser();
esUser5.setId(5);
esUser5.setName("王二");
esUser5.setNickName("王二");
esUser5.setAge(16);
esUser5.setSex("女");
List<EsUser> userList = new ArrayList<>();
userList.add(esUser1);
userList.add(esUser2);
userList.add(esUser3);
userList.add(esUser4);
userList.add(esUser5);
esUserMapper.insertBatch(userList);
}
}
只列举信息
四.一 equals
@Test
public void equalsTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
// String name = "岳泽霖";
String name = "霖";
lambdaEsQueryWrapper.eq(StringUtils.hasText(name), EsUser::getName,name);
List<EsUser> esUserList = esUserMapper.selectList(lambdaEsQueryWrapper);
printInfo(esUserList);
}
public void printInfo( List<EsUser> esUserList) {
if (CollectionUtils.isEmpty(esUserList)){
log.info(">>>> 未查询出用户信息");
return ;
}
esUserList.forEach(
n->{
log.info("用户信息: {}" ,n);
}
);
}
四.二 and 组合
@Test
public void andTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
String name = "霖";
String sex = "男";
lambdaEsQueryWrapper.eq(StringUtils.hasText(name), EsUser::getName,name);
lambdaEsQueryWrapper.eq(StringUtils.hasText(sex), EsUser::getSex,sex);
List<EsUser> esUserList = esUserMapper.selectList(lambdaEsQueryWrapper);
printInfo(esUserList);
}
四.三 or 组合
@Test
public void orTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
String name = "霖";
String sex = "男";
lambdaEsQueryWrapper.eq(StringUtils.hasText(name), EsUser::getName,name);
lambdaEsQueryWrapper.or().eq(StringUtils.hasText(sex), EsUser::getSex,sex);
List<EsUser> esUserList = esUserMapper.selectList(lambdaEsQueryWrapper);
printInfo(esUserList);
}
四.四 配置原始 restHighLevelClient 查询
@Resource
private RestHighLevelClient restHighLevelClient;
/**
原先查询
*/
@Test
public void originTest() throws Exception{
SearchRequest searchRequest = new SearchRequest();
// 设置索引
searchRequest.indices("es");
/**
构建条件
*/
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
// 进行请求
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits result = searchResponse.getHits();
log.info(">>> 花费的时间:{}", searchResponse.getTook());
log.info(">>>是否超时:{}", searchResponse.isTimedOut());
log.info(">>>> 总的数量:{}", result.getTotalHits());
log.info(">>>>最大的匹配分数值:{}", result.getMaxScore());
log.info(">>>>查询结果输出开始");
Arrays.stream(result.getHits()).forEach(
n -> log.info(">>>获取内容:{}", n.getSourceAsString())
);
log.info(">>>> 查询结果输出结束");
}
四.五 分页查询
/**
分页查询
*/
@Test
public void pageTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
EsPageInfo<EsUser> esUserPageInfo = esUserMapper.pageQuery(lambdaEsQueryWrapper, 1, 2);
log.info(">>> 总数是: {}" ,esUserPageInfo.getTotal());
printInfo(esUserPageInfo.getList());
}
四.六 排序
/**
排序查询
*/
@Test
public void orderTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
// 进行排序
lambdaEsQueryWrapper.orderByDesc(EsUser::getId);
EsPageInfo<EsUser> esUserPageInfo = esUserMapper.pageQuery(lambdaEsQueryWrapper, 1, 5);
log.info(">>> 总数是: {}" ,esUserPageInfo.getTotal());
printInfo(esUserPageInfo.getList());
}
四.七 获取 Dsl 数据
/**
获取 Dsl 数据
*/
@Test
public void getDslTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
// 进行排序
lambdaEsQueryWrapper.orderByDesc(EsUser::getId);
// from size
lambdaEsQueryWrapper.limit((1-1) * 5,5);
String source = esUserMapper.getSource(lambdaEsQueryWrapper);
log.info(">>> 执行语句: {}", source);
}
四.八 查询部分字段
四.八.一 只查询部分字段
/**
只查询字段
*/
@Test
public void selectTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
String name = "霖";
String sex = "男";
lambdaEsQueryWrapper.eq(StringUtils.hasText(name), EsUser::getName,name);
lambdaEsQueryWrapper.eq(StringUtils.hasText(sex), EsUser::getSex,sex);
lambdaEsQueryWrapper.select(EsUser::getId,EsUser::getName);
List<EsUser> esUserList = esUserMapper.selectList(lambdaEsQueryWrapper);
printInfo(esUserList);
}
四.八.二 不查询某些字段
/**
不查询字段
*/
@Test
public void notSelectTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
String name = "霖";
String sex = "男";
lambdaEsQueryWrapper.eq(StringUtils.hasText(name), EsUser::getName,name);
lambdaEsQueryWrapper.eq(StringUtils.hasText(sex), EsUser::getSex,sex);
lambdaEsQueryWrapper.notSelect(EsUser::getId,EsUser::getAge);
List<EsUser> esUserList = esUserMapper.selectList(lambdaEsQueryWrapper);
printInfo(esUserList);
}
四.九 单字段去重
/**
单字段去重
*/
@Test
public void dictTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
lambdaEsQueryWrapper.distinct(EsUser::getAge);
List<EsUser> esUserList = esUserMapper.selectList(lambdaEsQueryWrapper);
printInfo(esUserList);
}
只查询出来四条记录
四.十 分组查询
@Test
public void groupTest() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
lambdaEsQueryWrapper.groupBy(EsUser::getAge);
SearchResponse searchResponse = esUserMapper.search(lambdaEsQueryWrapper);
log.info(">>> 查询数据: {}" ,searchResponse);
}
配置最大,最小
@Test
public void group2Test() {
LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
lambdaEsQueryWrapper.groupBy(EsUser::getAge);
lambdaEsQueryWrapper.max(EsUser::getMaxAge);
lambdaEsQueryWrapper.min(EsUser::getMinAge);
SearchResponse searchResponse = esUserMapper.search(lambdaEsQueryWrapper);
log.info(">>> 查询数据: {}" ,searchResponse);
}
本章节的代码放置在 github 上:
https://github.com/yuejianli/springboot/tree/develop/SpringBoot_EasyES
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!