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 背景介绍 在机器学习和数据分析中,理解模型的预测是非常重要的。尤其是在深度学习黑盒模型中,我们往往难以直观地理解模型的预测行为。为…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
