锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. spring boot整合elasticsearch实现查询功能

spring boot整合elasticsearch实现查询功能

0
  • JAVA
  • 发布于 2024-08-14
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

第一步、添加依赖(注意版本对应关系)根据 spring boot 版本选择合适的版本

<dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.6.2</version>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>

第二步、添加配置

/**
 * 商城商品
 * @Author: 陈礼林
 * @CreateTime: 2023-04-20  09:28
 */
@Document(indexName = "mall_commodity")
@Data
public class MallCommodityDtoRsp {
 
    /**
     * 主键
     */
    @Id
    @Field(store = true, index = false, type = org.springframework.data.elasticsearch.annotations.FieldType.Text)
    private String id;
 
    /**
     * 商品名称
     */
    private String name;
 
    /**
    * 分类名称
    */
    private String classifyName;
 
    /**
    * 分类名称
    */
    private String attributeName;
 
    /**
    * 商品缩略图
    */
    private String picture;
 
    /**
    * 商品规格类型 1单规格 2多规格 3套餐
    */
    private Integer specType;
 
    /**
    * 商品编号
    */
    private String commodityNo;
 
    /**
    * 生产批号
    */
    private String batchNo;
    /**
     * 商品类型(1普通,2赠送)
     */
    private Integer commodityType;
 
    /**
    * 销售价格(单位分)
    */
    private Integer minPrice;
 
    /**
    * 销售价格(单位分)
    */
    private Integer maxPrice;
 
    /**
    * 单位
    */
    private String unit;
 
    /**
    * 排序
    */
    private Integer sort;
 
    /**
    * 商品数量
    */
    private Integer commodityCount;
 
    /**
    * 商品状态 1上架 2下架
    */
    private Integer status;
 
    @Field(store = true, index = false, type = FieldType.Object)
    private List<MallCommodityDetailed> detailedList;
 
}

 第三步、编码

/**
 * @Description: 同步mysql数据到es定时任务
 * @Author: 陈礼林
 * @CreateTime: 2024-03-16  10:56
 */
@Slf4j
@Component
public class CommoditySyncEsTask {
 
    @Resource
    private MallCommodityService service;
    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
 
 
    @XxlJob("commoditySyncEsHandler")
    public void commoditySyncEs(){
        log.info("开始执行:商品同步定时任务");
        MallCommodityDtoPageReq req = new MallCommodityDtoPageReq();
        List<MallCommodityDtoRsp> records = service.page(req).getRecords();
        if (ListUtil.isNotNull(records)) {
            elasticsearchRestTemplate.save(records);
        }
        log.info("执行结束:商品同步定时任务");
    }
}

 同步 mysql 数据到 elasticsearch 服务器

/**
 * 商城-商品表控制器
 *
 * @author 陈礼林
 * @date 2022-04-12 14:39:41
 */
@RestController
@RequestMapping("/mmServer/mall/commodity")
public class MallCommodityController {
 
    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
 
    /**
     * 分页
     *
     * @param req 分页参数
     * @return 查询结果
     */
    @PostMapping("/page")
    public R page(@RequestBody MallCommodityDtoPageReq req){
        //查询条件
//        查询全部数据
//        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
 
//        精确查询 =
//        QueryBuilder queryBuilder = QueryBuilders.termQuery("name", "lisi");
 
//        精确查询 多个 in
//        QueryBuilder queryBuilder = QueryBuilders.termsQuery("name", "张三", "lisi");
 
//        match匹配,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系,可以指定分词
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三");
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三").analyzer("ik_max_word");
 
//        match匹配 查询多个字段
//        QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("男", "name", "sex");
 
//        fuzzy 模糊查询,返回包含与搜索字词相似的字词的文档。
//        QueryBuilder  queryBuilder = QueryBuilders.fuzzyQuery("name","lisx");
 
//        prefix 前缀检索
//        QueryBuilder  queryBuilder = QueryBuilders.prefixQuery("name","张");
 
//        wildcard 通配符检索
//        QueryBuilder  queryBuilder = QueryBuilders.wildcardQuery("name","张*");
 
//        regexp 正则查询
//        QueryBuilder queryBuilder = QueryBuilders.regexpQuery("name", "(张三)|(lisi)");
 
//        boost 评分权重,令满足某个条件的文档的得分更高,从而使得其排名更靠前。
//        queryBuilder.boost(2);
//        多条件构建
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//        并且 and
//        queryBuilder.must(QueryBuilders.termQuery("name", "张三"));
        if (req.getSpecType() != null) {queryBuilder.must(QueryBuilders.termQuery("specType", req.getSpecType()));}
        if (req.getName() != null) {queryBuilder.should(QueryBuilders.fuzzyQuery("name", req.getName()));}
 
//        或者 or
//        queryBuilder.should(QueryBuilders.fuzzyQuery("name", "测试"));
//        queryBuilder.should(QueryBuilders.termQuery("name", "lisi"));
 
//        不等于,去除
//        queryBuilder.mustNot(QueryBuilders.termQuery("name", "lisi"));
 
//        过滤数据
//        queryBuilder.filter(QueryBuilders.matchQuery("name", "张三"));
 
//        范围查询
        /*
            gt 大于 >
            gte 大于等于 >=
            lt 小于 <
            lte 小于等于 <=
        */
//        queryBuilder.filter(new RangeQueryBuilder("age").gt(10).lte(50));
 
        //        构建分页,page 从0开始
        Pageable pageable = PageRequest.of(req.getPageNumber(), req.getPageSize());
 
        Query query = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withPageable(pageable)
                //排序
//                .withSort(SortBuilders.fieldSort("_score").order(SortOrder.DESC))
                //投影
//                .withFields("name")
                .build();
        SearchHits<MallCommodityDtoRsp> search = elasticsearchRestTemplate.search(query, MallCommodityDtoRsp.class);
        return R.ok(search.getSearchHits());
//        return R.ok(service.page(req));
    }
 
    /**
     * 通过id集合查询列表
     *
     * @param id id
     * @return 查询结果
     */
    @PostMapping("/get")
    public R<MallCommodityDtoRsp> get(@Param("id") Long id){
        MallCommodityDtoRsp search = elasticsearchRestTemplate.get(id.toString(),MallCommodityDtoRsp.class);
        return R.ok(search);
    }
 
}
/**
 * 商城-商品表控制器
 *
 * @author 陈礼林
 * @date 2022-04-12 14:39:41
 */
@RestController
@RequestMapping("/mmServer/mall/commodity")
public class MallCommodityController {
 
    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
 
    /**
     * 分页
     *
     * @param req 分页参数
     * @return 查询结果
     */
    @PostMapping("/page")
    public R page(@RequestBody MallCommodityDtoPageReq req){
        //查询条件
//        查询全部数据
//        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
 
//        精确查询 =
//        QueryBuilder queryBuilder = QueryBuilders.termQuery("name", "lisi");
 
//        精确查询 多个 in
//        QueryBuilder queryBuilder = QueryBuilders.termsQuery("name", "张三", "lisi");
 
//        match匹配,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系,可以指定分词
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三");
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "张三").analyzer("ik_max_word");
 
//        match匹配 查询多个字段
//        QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("男", "name", "sex");
 
//        fuzzy 模糊查询,返回包含与搜索字词相似的字词的文档。
//        QueryBuilder  queryBuilder = QueryBuilders.fuzzyQuery("name","lisx");
 
//        prefix 前缀检索
//        QueryBuilder  queryBuilder = QueryBuilders.prefixQuery("name","张");
 
//        wildcard 通配符检索
//        QueryBuilder  queryBuilder = QueryBuilders.wildcardQuery("name","张*");
 
//        regexp 正则查询
//        QueryBuilder queryBuilder = QueryBuilders.regexpQuery("name", "(张三)|(lisi)");
 
//        boost 评分权重,令满足某个条件的文档的得分更高,从而使得其排名更靠前。
//        queryBuilder.boost(2);
//        多条件构建
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//        并且 and
//        queryBuilder.must(QueryBuilders.termQuery("name", "张三"));
        if (req.getSpecType() != null) {queryBuilder.must(QueryBuilders.termQuery("specType", req.getSpecType()));}
        if (req.getName() != null) {queryBuilder.should(QueryBuilders.fuzzyQuery("name", req.getName()));}
 
//        或者 or
//        queryBuilder.should(QueryBuilders.fuzzyQuery("name", "测试"));
//        queryBuilder.should(QueryBuilders.termQuery("name", "lisi"));
 
//        不等于,去除
//        queryBuilder.mustNot(QueryBuilders.termQuery("name", "lisi"));
 
//        过滤数据
//        queryBuilder.filter(QueryBuilders.matchQuery("name", "张三"));
 
//        范围查询
        /*
            gt 大于 >
            gte 大于等于 >=
            lt 小于 <
            lte 小于等于 <=
        */
//        queryBuilder.filter(new RangeQueryBuilder("age").gt(10).lte(50));
 
        //        构建分页,page 从0开始
        Pageable pageable = PageRequest.of(req.getPageNumber(), req.getPageSize());
 
        Query query = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withPageable(pageable)
                //排序
//                .withSort(SortBuilders.fieldSort("_score").order(SortOrder.DESC))
                //投影
//                .withFields("name")
                .build();
        SearchHits<MallCommodityDtoRsp> search = elasticsearchRestTemplate.search(query, MallCommodityDtoRsp.class);
        return R.ok(search.getSearchHits());
//        return R.ok(service.page(req));
    }
 
    /**
     * 通过id集合查询列表
     *
     * @param id id
     * @return 查询结果
     */
    @PostMapping("/get")
    public R<MallCommodityDtoRsp> get(@Param("id") Long id){
        MallCommodityDtoRsp search = elasticsearchRestTemplate.get(id.toString(),MallCommodityDtoRsp.class);
        return R.ok(search);
    }
 
}
标签: #软件开发 1171 #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.