elasticsearch8.5版本集成springboot高版本3.0.0开发

news/2024/7/7 6:34:49 标签: spring boot, 后端, java, elasticsearch

基础环境

jdk版本:17
springboot 版本:3.0.0
springcloud版本:2022.0.0
elasticserch版本:8.5.1

Maven 配置

java">     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
        <relativePath/>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${sping-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>co.elastic.clients</groupId>
            <artifactId>elasticsearch-java</artifactId>
        </dependency>

业务常规开发

多条件&排序搜索文档数据

java">    public List<ProductResp> queryProductDoc(ProductReq req) {
        List<ProductResp> productList = Lists.newArrayList();
		List<Query> queries = getQueryConditions(req);
		
 		SearchResponse<ProductResp> search  = elasticsearchClient.search(s -> s
                        .index("product")
                        .query(q->q.bool(b->b.must(queries)))
                        //分页查询,从第0页开始查询size个document
                        .from(req.getPageNum()-1)
                        .size(req.getPageSize())
                        //按createTime降序、状态升序排序
                        .sort(f->f.field(o->o.field("createTime").order(SortOrder.Desc)))
                        .sort(f->f.field(o->o.field("status").order(SortOrder.Asc)))
                        ,ProductResp.class);
       for (Hit<ProductResp> hit : search.hits().hits()) {
            ProductResp resp = hit.source();
            productList.add(resp);
       }
       return productList;
   }
 /**
     * 组装查询的条件
     * @param req
     * @return
     */
    private List<Query> getQueryConditions(ProductReq req){
        List<Query> queries = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(req.getBrandIds())){
            List<FieldValue> values = new ArrayList<>();
            for (String id : req.getBrandIds()) {
                values.add(FieldValue.of(id));
            }
            //brandId字段精确查询
            Query brandQuery = TermsQuery.of(t -> t.field("brandId").terms(new TermsQueryField.Builder()
                    .value(values).build()
            ))._toQuery();

            queries.add(brandQuery);
        }

        if(!Objects.isNull(req.getCategoryCodes())&&req.getCategoryCodes()!=0){
            List<FieldValue> values = new ArrayList<>();
            values.add(FieldValue.of(req.getCategoryCodes()));
            //categoryCodes精确匹配多个枚举值(类似sql in查询: where categoryCodes in (values))
            Query mallL5CategoriesQuery = TermsQuery.of(t->t.field("categoryCodes").terms(new TermsQueryField.Builder()
                    .value(values).build()))._toQuery();
            queries.add(mallL5CategoriesQuery);
        }
      

        if(!Objects.isNull(req.getIsHaveStock())){
            if(req.getIsHaveStock()==1){
                JsonData stockFlag = JsonData.of(0);
                //availableStock范围查询(类似sql:where availableStock>xxx)
                Query hasStockQuery = RangeQuery.of(t->t.field("availableStock").gt(stockFlag))._toQuery();
                queries.add(hasStockQuery);
            }else{
                JsonData stockFlag = JsonData.of(0);
                Query hasStockQuery = RangeQuery.of(t->t.field("availableStock").lte(stockFlag))._toQuery();
                queries.add(hasStockQuery);
            }
        }

        if(StringUtils.isNotBlank(req.getKeyWord())){
            String keyword = req.getKeyWord();
            if (req.getKeyWord().contains("|")) {
                keyword = keyword.replace("|", "");
            } else {
                keyword = req.getKeyWord();
            }
            final String finalKeyWord = keyword;
			//前端传一个关键字匹配多字段,类似sql语句(where name like '%keyword%' or code like '%keyword%' or desc like '%keyword%' )
            Query nameQuery= MatchQuery.of(m->m.field("name").query(req.getKeyWord()))._toQuery();
            Query codeQuery= MatchQuery.of(m->m.field("code").query(finalKeyWord))._toQuery();
            Query descQuery= MatchQuery.of(m->m.field("desc").query(finalKeyWord))._toQuery();
            List<Query> newQuery = Arrays.asList(nameQuery, codeQuery, descQuery);
            Query query = BoolQuery.of(m -> m.should(newQuery))._toQuery();
            //skuCode //productSize
            queries.add(query);
        }
        return queries;
    }

http://www.niftyadmin.cn/n/5281820.html

相关文章

云轴科技ZStack 英特尔联合成立云系统解决方案创新中心

近日&#xff0c;云轴科技ZStack 与英特尔联合成立云系统解决方案创新中心&#xff0c;并完成揭牌仪式。双方将基于多年合作基础进一步加快研发下一代创新技术和解决方案&#xff0c;为客户和合作伙伴提供更高效、安全的云基础设施解决方案。 左三:云轴科技ZStack 联合创始人兼…

前端开发中利用css的scoped和deep的方法实现样式穿透

scoped作用域 在vue中&#xff0c;我们为了避免父组件的样式影响到子组件的样式&#xff0c;会在style中加 父组件&#xff1a; <template><div><h1 class"title">{{ name }}</h1><input type"text" v-model.lazy"name…

Http---HTTP 请求报文

1. HTTP 请求报文介绍 HTTP最常见的请求报文有两种: GET 方式的请求报文POST 方式的请求报文 说明: GET: 获取web服务器数据POST: 向web服务器提交数据 2. HTTP GET 请求报文分析 HTTP GET 请求报文效果图: GET 请求报文说明: ---- 请求行 ---- GET / HTTP/1.1 # GET请…

Android 网络状态判断

1、获取网络信息&#xff0c;首先需要获取权限 <uses-permission android:name"android.permission.INTERNET" /> <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /> 2.1我们通过ConnectivityManager可以获取状态…

【RabbitMQ】RabbitMQ详解(一)

RabbitMQ详解 RabbitMQ介绍四大核心概念RabbitMQ 入门案例Hello RabbitMQ生产者消费者 Work Queues轮询消费 RabbitMQ消息应答与发布自动应答手动应答的方法肯定确认应答否定确认应答拒绝处理该消息恢复到消息队列Multiple的解释消息重新入队手动应答案例 RabbitMQ持久化队列持…

使用vs2019自动生成类图(纯c++项目或者qt项目)

目录 1. vs安装UML插件 2. 生成UML类图 1. vs安装UML插件 2. 生成UML类图 如果是纯c项目&#xff1a; 视图 -》类视图 。右击其中一个类&#xff0c;查看类图 如果是查看已存在的Qt项目&#xff0c;则需要新建一个Qt Console Application 删除自动生成的main.cpp&#xff0c…

[每周一更]-(第78期):Nginx负载均衡proxy_pass代理模块常用参数配置

0、负载均衡的策略 使用场景示例 # 定义要包含在负载均衡方案中的服务器。 # 最好使用服务器的私有IP以获得更好的性能和安全性。 http {upstream backend {server 10.1.0.101;server 10.1.0.102;server 10.1.0.103;}server{server_name game1.test.com;listen 80;location / {…

AI 论文精读,中文视频讲解:剖析人工智能本质 | 开源日报 No.120

mli/paper-reading Stars: 21.8k License: Apache-2.0 深度学习论文精读是一个深度学习相关论文列表&#xff0c;包括计算机视觉、生成模型、自然语言处理等多个领域。 该项目的核心优势和特点包括&#xff1a; 提供了大量关于深度学习各领域热门文章内容对不同年份发表的有较…