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 背景介绍 在机器学习和数据分析中,理解模型的预测是非常重要的。尤其是在深度学习黑盒模型中,我们往往难以直观地理解模型的预测行为。为…...
FPGA篇---Vivado 与 Vitis 的区别详解
Vivado 和 Vitis 是 AMD(原 Xilinx)推出的两款核心开发工具,分别针对 硬件设计 和 软件/系统级开发。两者既有明确分工,又在现代设计流程中深度融合。1. 核心定位差异维度VivadoVitis全称Vivado Design SuiteVitis Unified Softwa…...
数字游民工作流:OpenClaw+nanobot全球远程办公方案
数字游民工作流:OpenClawnanobot全球远程办公方案 1. 为什么需要自动化全球办公方案 作为一名长期在东南亚各国旅居的数字游民,我深刻体会到跨时区工作的痛苦。凌晨三点被欧洲同事的Slack消息吵醒,错过亚太区的晨会,或是忘记在不…...
**基于Python实现脉冲神经网络:从理论到代码的创新实践**在深度
基于Python实现脉冲神经网络:从理论到代码的创新实践 在深度学习飞速发展的今天,传统人工神经网络(ANN)已难以满足对生物可解释性和能效比更高的需求。而**脉冲神经网络(Spiking Neural Networks, SNN)**作…...
springboot-vue+nodejs的农产品扶贫助农系统的开发与实现
目录技术栈选择系统架构设计核心功能模块开发阶段划分关键代码示例(Spring Boot)前端组件示例(Vue)注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 Spring Bo…...
C#运动控制库大比拼:HALCON vs Leadshine,哪个更适合你的项目?
C#运动控制库深度评测:HALCON与Leadshine的工业级对决 在工业自动化领域,选择合适的运动控制库往往决定着项目的成败。作为C#开发者,我们常面临一个关键抉择:是选择功能全面的HALCON,还是专注运动控制的Leadshine&…...
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程 在全球化内容消费的今天,语言障碍成为许多人获取知识的隐形门槛。想象一下,当你发现一个精彩的英文技术讲座视频,却因为语言问题无法充分理解;或是需要将中…...
颠覆式数据主权革命:WeChatMsg如何让你的聊天记录真正归属自己
颠覆式数据主权革命:WeChatMsg如何让你的聊天记录真正归属自己 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…...
收藏级|AI岗位全景与转行指南:从技能到Offer(小白/程序员必看)
无论是刚入门的编程小白,还是想转行AI赛道的在职程序员,这份指南都能帮你理清方向——不玩虚的,全是可落地的岗位解析、技能清单、简历技巧和学习路线,收藏起来,跟着走就能少走弯路,高效切入AI领域…...
ContextMenuManager:高效管理Windows右键菜单的全方案
ContextMenuManager:高效管理Windows右键菜单的全方案 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是我们日常操作电脑时最常用的…...
【限时技术白皮书首发】:《边缘Python量化工具实战手册》V2.1——涵盖TVM 0.14 + MLIR + 自定义OP全流程
第一章:边缘Python量化工具概览与V2.1核心升级边缘Python量化工具是一套面向嵌入式AI场景的轻量级模型压缩与部署框架,专为资源受限设备(如RISC-V MCU、Cortex-M7、ESP32-S3等)设计,支持从PyTorch/TensorFlow模型无缝转…...
