SpringBoot整合 EasyES (八)
  TEZNKK3IfmPf 2023年11月12日 42 0

一直在坑自己家人,对,说的就是你,大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独有的功能,助力您快速实现各种场景的开发.

EE的主要特性如下:

  • 全自动索引托管:开发者无需关心索引的创建、更新及数据迁移等繁琐步骤,框架能自动完成。
  • 屏蔽语言差异:开发者只需要会MySQL的语法即可使用ES。
  • 代码量极少:与直接使用官方提供的RestHighLevelClient相比,相同的查询平均可以节省3-5倍的代码量。
  • 零魔法值:字段名称直接从实体中获取,无需手写。
  • 零额外学习成本: 开发者只要会国内最受欢迎的Mybatis-Plus用法,即可无缝迁移至EE。

一.一 添加依赖

一.一.一 去除 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);
    }
}

SpringBoot整合 EasyES (八)

二.二.二 索引名注解 @IndexName

使用位置, 在 实体类上

@Data
@IndexName("es")
public class EsUser implements Serializable {
    
}

SpringBoot整合 EasyES (八)

二.二.三 ES主键 @IndexId

使用位置:实体类中被作为ES主键的字段, 对应MP的@TableId注解

// value 默认为 _id
    @IndexId(type = IdType.CUSTOMIZE)
    private Integer id;

SpringBoot整合 EasyES (八)

一般是用户自定义配置.

二.二.四 一般属性配置 @IndexField

实体类中被作为ES索引字段的字段

@IndexField(strategy = FieldStrategy.NOT_EMPTY,fieldType = FieldType.TEXT, analyzer = "ik_max_word")
    private String nickName;
    @IndexField(fieldType = FieldType.INTEGER)
    private Integer age;

SpringBoot整合 EasyES (八)

二.二.五 得分注解 @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);
                }
        );
    }

SpringBoot整合 EasyES (八)

四.二 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);
    }

SpringBoot整合 EasyES (八)

四.三 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);
    }

SpringBoot整合 EasyES (八)

四.四 配置原始 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());
    }

SpringBoot整合 EasyES (八)

四.六 排序

/**
     排序查询
     */
    @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());
    }

SpringBoot整合 EasyES (八)

四.七 获取 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);
    }

SpringBoot整合 EasyES (八)

四.八 查询部分字段

四.八.一 只查询部分字段

/**
    只查询字段
     */
    @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);
    }

SpringBoot整合 EasyES (八)

四.八.二 不查询某些字段

/**
   不查询字段
     */
    @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);
    }

SpringBoot整合 EasyES (八)

四.九 单字段去重

/**
     单字段去重
     */
    @Test
    public void dictTest() {
        LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
        lambdaEsQueryWrapper.distinct(EsUser::getAge);
        List<EsUser> esUserList = esUserMapper.selectList(lambdaEsQueryWrapper);
        printInfo(esUserList);
    }

SpringBoot整合 EasyES (八)

只查询出来四条记录

四.十 分组查询

@Test
    public void groupTest() {
        LambdaEsQueryWrapper<EsUser> lambdaEsQueryWrapper = new LambdaEsQueryWrapper<>();
        lambdaEsQueryWrapper.groupBy(EsUser::getAge);
        SearchResponse searchResponse = esUserMapper.search(lambdaEsQueryWrapper);
        log.info(">>> 查询数据: {}" ,searchResponse);
    }

SpringBoot整合 EasyES (八)

配置最大,最小

@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);
    }

SpringBoot整合 EasyES (八)

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
TEZNKK3IfmPf