Springboot整合Elasticsearch 7.X 复杂查询
这里使用Springboot 2.7.12版本,Elasticsearch为7.15.0。
导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
yaml文件配置:
elasticsearch:uris: http://localhost:9200
构建实体类,这里为商品的SKU属性表
@Data
@Document(indexName = "skusearch")
public class SkuEs {@Idprivate String id;@Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")private String name;private Integer price;private Integer num;private String image;private String images;private Date createTime;private Date updateTime;private String spuId;private Integer categoryId;//Keyword:不分词@Field(type= FieldType.Keyword)private String categoryName;private Integer brandId;@Field(type=FieldType.Keyword)private String brandName;@Field(type=FieldType.Keyword)private String skuAttribute;private Integer status;
}
构建service层进行复杂查询:指定条件查询,聚合查询,分页查询,排序查询,高亮等等
@Service
public class SkuSearchServiceImpl implements SkuSearchService {@AutowiredElasticsearchRestTemplate elasticsearchRestTemplate;@Overridepublic Map<String, Object> search(Map<String, Object> map) {if(map!=null&&map.size()>0) {NativeSearchQueryBuilder queryBuilder = queryBuilder(map);//分组查询group(queryBuilder, map);// NativeSearchQuery nativeSearchQuery = queryBuilder.build();SearchHits<SkuEs> skuEsSearchHits = elasticsearchRestTemplate.search(queryBuilder.build(), SkuEs.class);AggregationsContainer<?> aggregations = skuEsSearchHits.getAggregations();Aggregations aggregations1 = (Aggregations) aggregations.aggregations();Map<String, Object> searchMap = new HashMap<>();//解析分组数据parseGroup(aggregations1, searchMap);//遍历返回的内容进行处理List<SearchHit<SkuEs>> searchHits = skuEsSearchHits.getSearchHits();//将高亮的内容填充到content中List<SkuEs> skuEsList = searchHits.stream().map(i -> {Map<String, List<String>> highlightFields = i.getHighlightFields();List<String> name = highlightFields.get("name");i.getContent().setName(name==null?i.getContent().getName():name.get(0));return i.getContent();}).collect(Collectors.toList());//数据元素searchMap.put("list", skuEsList);//数据元素总数searchMap.put("totalElements", skuEsList.size());return searchMap;}return null;}public NativeSearchQueryBuilder queryBuilder(Map<String, Object> searchMap){NativeSearchQueryBuilder queryBuilder=new NativeSearchQueryBuilder();BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();if(searchMap!=null&&searchMap.size()>0){//根据产品关键词进行查询String keyword = searchMap.get("keyword").toString();if(!StringUtils.isEmpty(keyword))boolQueryBuilder.must(QueryBuilders.termQuery("name",keyword));//查询指定的品牌String brandName=searchMap.get("brand").toString();if(!StringUtils.isEmpty(brandName)){boolQueryBuilder.must(QueryBuilders.termQuery("brandName",brandName));}//根据价格进行查询,形式为gteprice-ltepriceString price = searchMap.get("price").toString();if(!StringUtils.isEmpty(price)){String[] split = price.split("-");boolQueryBuilder.must(QueryBuilders.rangeQuery("price").gte(split[0]));if(split.length>1)boolQueryBuilder.must(QueryBuilders.rangeQuery("price").lte(split[1]));}}//根据价格,对于查询出来的产品进行降序排列queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));//分页查询queryBuilder.withPageable(PageRequest.of(Integer.parseInt(searchMap.get("current").toString()),Integer.parseInt(searchMap.get("size").toString())));queryBuilder.withQuery(boolQueryBuilder);//高亮设置queryBuilder.withHighlightFields(new HighlightBuilder.Field("name"));queryBuilder.withHighlightBuilder(new HighlightBuilder().preTags("<em>").postTags("</em>"));return queryBuilder;}public void group(NativeSearchQueryBuilder queryBuilder,Map<String, Object> searchMap){//用户如果没有输入分类条件,则需要将分类搜索出来,作为条件提供给用户if(StringUtils.isEmpty(searchMap.get("category"))){queryBuilder.withAggregations(AggregationBuilders.terms("categoryList").field("categoryName").size(100));}//用户如果没有输入品牌条件,则需要将品牌搜索出来,作为条件提供给用户if(StringUtils.isEmpty(searchMap.get("brand"))){queryBuilder.withAggregations(AggregationBuilders.terms("brandList").field("brandName").size(100));}}//解析分组数据public void parseGroup(Aggregations aggregations, Map<String,Object> resultMap){if(aggregations!=null){for (Aggregation aggregation : aggregations) {ParsedStringTerms terms = (ParsedStringTerms) aggregation;String name = terms.getName();List<String> collect = terms.getBuckets().stream().map(i -> i.getKeyAsString()).collect(Collectors.toList());resultMap.put(name,collect);}}}}
接口测试:

查询如下:
{"data": {"categoryList": ["软件研发"],"brandList": ["华为"],"list": [{"id": "1318594982227025922","name": "<em>华为</em>Mate40 Pro 32G","price": 114,"num": 1228,"image": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/af1faf56-b10a-4700-9896-3143a2d1c40f.jpg","images": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/a65bfbe4-21b7-42b2-b5cf-47a9730e0a16.jpg,https://sklll.oss-cn-beijing.aliyuncs.com/secby/fa52ef66-7724-4d6e-bece-15eba0f8f903.jpg,https://sklll.oss-cn-beijing.aliyuncs.com/secby/734f0f17-ac73-45d3-a6bf-83e1569ce887.jpg","createTime": "2020-10-20T08:48:37.000+00:00","updateTime": "2023-12-30T07:41:20.000+00:00","spuId": "1318594982147334146","categoryId": 11159,"categoryName": "软件研发","brandId": 11,"brandName": "华为","skuAttribute": "{\"就业薪资\":\"10K起\",\"学习费用\":\"2万\"}","status": 1,"attrMap": null},{"id": "1318596430360813570","name": "<em>华为</em>Mate40 Pro 32G 1800万像素","price": 112,"num": 1227,"image": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/9247d041-e940-426c-8e50-06084b631063.jpg","images": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/5f5b7435-6cf2-4797-8f65-d4abff181390.jpg","createTime": "2020-10-20T08:54:22.000+00:00","updateTime": "2023-12-30T07:41:21.000+00:00","spuId": "1318596430293704706","categoryId": 11159,"categoryName": "软件研发","brandId": 11,"brandName": "华为","skuAttribute": "{\"就业薪资\":\"10K起\",\"学习费用\":\"2万\"}","status": 1,"attrMap": null},{"id": "1318596430398562305","name": "<em>华为</em>Mate40 Pro 128G","price": 111,"num": 1226,"image": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/900a3618-9884-4778-bad9-c6c31eaf3eab.jpg","images": "https://sklll.oss-cn-beijing.aliyuncs.com/secby/5f5b7435-6cf2-4797-8f65-d4abff181390.jpg","createTime": "2020-10-20T08:54:22.000+00:00","updateTime": "2023-12-30T07:41:24.000+00:00","spuId": "1318596430293704706","categoryId": 11159,"categoryName": "软件研发","brandId": 11,"brandName": "华为","skuAttribute": "{\"就业薪资\":\"10K起\",\"学习费用\":\"2万\"}","status": 1,"attrMap": null}],"totalElements": 3},"code": 20000,"message": "操作成功"
}
相关文章:
Springboot整合Elasticsearch 7.X 复杂查询
这里使用Springboot 2.7.12版本,Elasticsearch为7.15.0。 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency> yaml文件配置…...
第5课 使用openCV捕获摄像头并实现预览功能
这节课我们开始利用ffmpeg和opencv来实现一个rtmp推流端。推流端的最基本功能其实就两个:预览画面并将画面和声音合并后推送到rtmp服务器。 一、FFmpeg API 推流的一般过程 1.引入ffmpeg库:在代码中引入ffmpeg库,以便使用其提供的功能。 2.捕获摄像头…...
Python3操作Json文件碰到的几个问题
文章目录 小结问题及解决byte数组与str字符串之间不兼容没有Index属性JSON.DUMP(S) & JSON.LOAD(S) 参考 小结 使用Python3操作Json文件碰到的几个问题,进行了解决。 问题及解决 byte数组与str字符串之间不兼容 以下的几个问题都是由于字节数组和字符串之间…...
Java中的自定义异常处理:业务异常类的创建与使用
文章内容 引言 在Java编程中,异常处理是一项重要的技术,它允许程序在遇到错误或特殊情况时能够优雅地处理,而不是直接崩溃。Java提供了丰富的内置异常类,但在实际业务开发中,我们往往需要根据具体的业务需求定义自己的…...
微信小程序有几个文件
微信小程序通常由多个文件组成,主要包括以下几种类型的文件: JSON 配置文件: app.json: 整个小程序的全局配置,包括页面路径、窗口样式、网络超时时间等。 page.json: 单个页面的配置,用于指定该页面的窗口样式、导航…...
计算机网络:知识回顾
0 本节主要内容 问题描述 解决思路 1 问题描述 通过一个应用场景来回顾计算机网络涉及到的协议(所有层)。如下图所示场景: 学生Bob将笔记本电脑用一根以太网电缆连接到学校的以太网交换机;交换机又与学校的路由器相连…...
【Python百宝箱】音韵探奇:探索Python中的音频与信号魔法
数字音符:畅游Python音频与信号处理的科技奇境 前言 在数字时代,音频与信号处理不仅仅是专业领域的关键,也成为了科技创新和艺术创作的核心。本文将带领您深入探索Python中多个强大的音频处理库和信号处理工具,从Librosa到Tenso…...
springboot(ssm农产品直卖平台 农产品商城系统Java系统
springboot(ssm农产品直卖平台 农产品商城系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0) 数…...
C#编程-使用条件构造
使用条件构造 作判定是人的基本能力。判定也是可收编进程序。这有助于确定程序执行指令的顺序。 您可用条件构造来控制程序的流程。条件构造允许您基于被求职的表达式的结果来执行选定语句。 可以包含在C#程序中的各种条件构造是: if…else 构造switch…case 构造if…else构…...
【BERT】深入理解BERT模型1——模型整体架构介绍
前言 BERT出自论文:《BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding》 2019年 近年来,在自然语言处理领域,BERT模型受到了极为广泛的关注,很多模型中都用到了BERT-base或者是BE…...
【Java开发岗面试】八股文—设计模式
声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…...
GO基础进阶篇 (九)、临界资源安全问题(锁、channel)
临界资源安全问题 在并发编程中对临界资源的处理不当,往往会导致数据的不一致问题 package mainimport ("fmt""time" )func main() {a : 1go func() {a 2fmt.Println("goroutine", a)}()a 3fmt.Println("a", a)time.Sl…...
Python基础-04(比较运算符、逻辑运算符)
文章目录 前言一、比较运算符二、逻辑运算符1.and(与)2.or(或)3.not(非)4.逻辑运算符的细节(短路原则)(着重理解) 总结 前言 1、比较运算符内容很简单&#…...
MySQL 四种插入命令及其特点与锁机制
目录 1. INSERT INTO 2. INSERT IGNORE INTO 3. INSERT INTO ... ON DUPLICATE KEY UPDATE 4. REPLACE INTO 总结 MySQL提供了多种数据插入方式,每种方式在处理唯一键冲突时的行为不同,同时也涉及不同的锁机制。 1. INSERT INTO INSERT INTO是标准…...
AKShare学习笔记
AKShare学习笔记 本文内容参考AKShare文档。AKShare开源财经数据接口库采集的数据都来自公开的数据源,数据接口查询出来的数据具有滞后性。接口参考AKShare数据字典。 AKShare环境配置 安装Anaconda,使用Anaconda3-2019.07版本包,配置清华数…...
A星寻路算法
A星寻路算法简介 A星寻路算法(A* Search Algorithm)是一种启发式搜索算法,它在图形平面上进行搜索,寻找从起始点到终点的最短路径。A星算法结合了广度优先搜索(BFS)和最佳优先搜索(Best-First S…...
QDialog
属性方法 样式表 background-color: qlineargradient(spread:reflect, x1:0.999896, y1:0.494136, x2:1, y2:1, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border: 1px groove rgb(232, 232, 232);border-radius: 20px; QDialog 的常用方法: e…...
Spark中使用DataFrame进行数据转换和操作
Apache Spark是一个强大的分布式计算框架,其中DataFrame是一个核心概念,用于处理结构化数据。DataFrame提供了丰富的数据转换和操作功能,使数据处理变得更加容易和高效。本文将深入探讨Spark中如何使用DataFrame进行数据转换和操作࿰…...
windows11新装机,简单评测系统自带软件(基本涵盖日常所需应用)
新年将近,由于当年安排的失误,系统盘(100G)和照片视频盘(4T)容量不够了,大容量的那块机械盘放在机箱里就在耳朵根吵吵,烦得很,于是狠狠心决定扩容后重配重装。 2023年最后…...
概念解析 | Shapley值及其在深度学习中的应用
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Shapley值及其在深度学习中的应用。 1 背景介绍 在机器学习和数据分析中,理解模型的预测是非常重要的。尤其是在深度学习黑盒模型中,我们往往难以直观地理解模型的预测行为。为…...
Lingbot-Depth-Pretrain-Vitl-14 结合Transformer架构:深度估计模型优化实战
Lingbot-Depth-Pretrain-Vitl-14 结合Transformer架构:深度估计模型优化实战 深度估计,简单来说,就是让计算机从一张普通的2D图片里,“猜”出每个像素点距离相机的远近。这听起来有点像我们人眼在看世界时,能感知到的…...
3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由
3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由 【免费下载链接】Yuedu 📚「阅读」APP 精品书源(网络小说) 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 你是否经历过这样的时刻:深夜追更的小说…...
OpenClaw飞书机器人:Qwen3-VL:30B多模态应用指南
OpenClaw飞书机器人:Qwen3-VL:30B多模态应用指南 1. 为什么选择OpenClawQwen3-VL:30B组合? 去年冬天,当我第一次尝试用AI助手处理团队飞书群里的图片报销单时,经历了惨痛的失败——要么识别错金额,要么把同事的午餐照…...
WaveTools终极指南:免费解锁《鸣潮》流畅体验的完整解决方案
WaveTools终极指南:免费解锁《鸣潮》流畅体验的完整解决方案 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》游戏卡顿、帧率不稳而烦恼吗?WaveTools鸣潮工具箱为你带…...
OpenClaw技能分享:GLM-4.7-Flash社区优秀案例解析
OpenClaw技能分享:GLM-4.7-Flash社区优秀案例解析 1. 为什么关注社区Skill案例 在探索OpenClaw自动化能力的过程中,我发现官方文档只能教会基础操作,真正让人眼前一亮的创意往往来自社区。最近测试GLM-4.7-Flash模型时,意外发现…...
音频处理必备:5分钟搞懂IIR和FIR滤波器的区别与应用场景
音频处理必备:5分钟搞懂IIR和FIR滤波器的区别与应用场景 在音乐制作和音频工程领域,滤波器是塑造声音的核心工具之一。无论是调整均衡、消除噪声还是创造特殊音效,都离不开对IIR和FIR这两类滤波器的深入理解。许多刚入门的音频工程师常常困惑…...
如何快速掌握QRemeshify:面向初学者的Blender四边形网格重构完整指南
如何快速掌握QRemeshify:面向初学者的Blender四边形网格重构完整指南 【免费下载链接】QRemeshify A Blender extension for an easy-to-use remesher that outputs good-quality quad topology 项目地址: https://gitcode.com/gh_mirrors/qr/QRemeshify QRe…...
C++程序员逆袭之路:手把手教你转行大模型算法岗!
作为一名C程序员,你拥有强大的编程能力和对底层系统深入理解的优势。然而,如果你对大数据、深度学习和算法设计充满热情,转行到大模型算法岗位可能是一个充满挑战和机遇的职业转变。本文将为你提供一份详细的转行指南,帮助你从C开…...
OpenClaw网关配置详解:Qwen3-32B镜像的端口与安全设置
OpenClaw网关配置详解:Qwen3-32B镜像的端口与安全设置 1. 为什么需要关注网关配置? 上周我在本地部署Qwen3-32B模型时,遇到了一个尴尬的问题:凌晨3点被安全团队电话叫醒,原因是OpenClaw的测试端口被扫描到异常流量。…...
CodeBlocks-25.03 在 Windows 上的完整配置与避坑指南
1. 为什么选择CodeBlocks-25.03? 如果你刚开始学习C/C编程,CodeBlocks绝对是个不错的选择。作为一个开源的集成开发环境(IDE),它轻量级、跨平台,最重要的是完全免费。我十年前刚开始写代码时用的就是CodeBl…...
