spring boot整合elasticsearch实现查询功能

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

XML 复制代码
        <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>

第二步、添加配置

复制代码
spring:
  elasticsearch:
    rest:
      uris: localhost:9200
      connection-timeout: 1000
      request-timeout: 1000
      read-timeout: 1000
      username: elastic
      password: elastic

第三步、编码

java 复制代码
/**
 * 商城商品
 * @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;

}

同步mysql数据到elasticsearch服务器

java 复制代码
/**
 * @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("执行结束:商品同步定时任务");
    }
}
java 复制代码
/**
 * 商城-商品表控制器
 *
 * @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);
    }

}
相关推荐
渣哥4 分钟前
Lazy能否有效解决循环依赖?答案比你想的复杂
javascript·后端·面试
qq_12498707538 分钟前
基于Spring Boot的网上招聘服务系统(源码+论文+部署+安装)
java·spring boot·后端·spring·计算机外设
IT_陈寒1 小时前
Java性能调优实战:7个让GC效率提升50%的关键参数设置
前端·人工智能·后端
Apifox1 小时前
如何在 Apifox 中通过 AI 一键生成几十个测试用例?
前端·后端·ai编程
用户298698530142 小时前
Java高效读取CSV文件的方法与分步实例
java·后端
一根甜苦瓜2 小时前
Go语言Slice的一道骚题
开发语言·后端·golang
uhakadotcom2 小时前
coze的AsyncTokenAuth和coze的TokenAuth有哪些使用的差异?
后端·面试·github
NPE~2 小时前
[手写系列]Go手写db — — 第五版(实现数据库操作模块)
开发语言·数据库·后端·golang·教程·手写系列·手写数据库
程序员卷卷狗2 小时前
JVM实战:从内存模型到性能调优的全链路剖析
java·jvm·后端·性能优化·架构
王中阳Go2 小时前
Python 的 PyPy 能追上 Go 的性能吗?
后端·python·go