当前位置: 首页 > news >正文

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);}}}}

接口测试:

94597aa9c15a4c0890418af668d4771f.png

查询如下:

{"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版本&#xff0c;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库&#xff1a;在代码中引入ffmpeg库&#xff0c;以便使用其提供的功能。 2.捕获摄像头…...

Python3操作Json文件碰到的几个问题

文章目录 小结问题及解决byte数组与str字符串之间不兼容没有Index属性JSON.DUMP(S) & JSON.LOAD(S) 参考 小结 使用Python3操作Json文件碰到的几个问题&#xff0c;进行了解决。 问题及解决 byte数组与str字符串之间不兼容 以下的几个问题都是由于字节数组和字符串之间…...

Java中的自定义异常处理:业务异常类的创建与使用

文章内容 引言 在Java编程中&#xff0c;异常处理是一项重要的技术&#xff0c;它允许程序在遇到错误或特殊情况时能够优雅地处理&#xff0c;而不是直接崩溃。Java提供了丰富的内置异常类&#xff0c;但在实际业务开发中&#xff0c;我们往往需要根据具体的业务需求定义自己的…...

微信小程序有几个文件

微信小程序通常由多个文件组成&#xff0c;主要包括以下几种类型的文件&#xff1a; JSON 配置文件&#xff1a; app.json: 整个小程序的全局配置&#xff0c;包括页面路径、窗口样式、网络超时时间等。 page.json: 单个页面的配置&#xff0c;用于指定该页面的窗口样式、导航…...

计算机网络:知识回顾

0 本节主要内容 问题描述 解决思路 1 问题描述 通过一个应用场景来回顾计算机网络涉及到的协议&#xff08;所有层&#xff09;。如下图所示场景&#xff1a; 学生Bob将笔记本电脑用一根以太网电缆连接到学校的以太网交换机&#xff1b;交换机又与学校的路由器相连&#xf…...

【Python百宝箱】音韵探奇:探索Python中的音频与信号魔法

数字音符&#xff1a;畅游Python音频与信号处理的科技奇境 前言 在数字时代&#xff0c;音频与信号处理不仅仅是专业领域的关键&#xff0c;也成为了科技创新和艺术创作的核心。本文将带领您深入探索Python中多个强大的音频处理库和信号处理工具&#xff0c;从Librosa到Tenso…...

springboot(ssm农产品直卖平台 农产品商城系统Java系统

springboot(ssm农产品直卖平台 农产品商城系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…...

C#编程-使用条件构造

使用条件构造 作判定是人的基本能力。判定也是可收编进程序。这有助于确定程序执行指令的顺序。 您可用条件构造来控制程序的流程。条件构造允许您基于被求职的表达式的结果来执行选定语句。 可以包含在C#程序中的各种条件构造是: if…else 构造switch…case 构造if…else构…...

【BERT】深入理解BERT模型1——模型整体架构介绍

前言 BERT出自论文&#xff1a;《BERT&#xff1a;Pre-training of Deep Bidirectional Transformers for Language Understanding》 2019年 近年来&#xff0c;在自然语言处理领域&#xff0c;BERT模型受到了极为广泛的关注&#xff0c;很多模型中都用到了BERT-base或者是BE…...

【Java开发岗面试】八股文—设计模式

声明&#xff1a; 背景&#xff1a;本人为24届双非硕校招生&#xff0c;已经完整经历了一次秋招&#xff0c;拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验&#xff08;主要是校招&#xff09;&#xff0c;包括我自己总结的八股文、算法、项目介绍、HR面和面试…...

GO基础进阶篇 (九)、临界资源安全问题(锁、channel)

临界资源安全问题 在并发编程中对临界资源的处理不当&#xff0c;往往会导致数据的不一致问题 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&#xff08;与&#xff09;2.or&#xff08;或&#xff09;3.not&#xff08;非&#xff09;4.逻辑运算符的细节&#xff08;短路原则&#xff09;&#xff08;着重理解&#xff09; 总结 前言 1、比较运算符内容很简单&#…...

MySQL 四种插入命令及其特点与锁机制

目录 1. INSERT INTO 2. INSERT IGNORE INTO 3. INSERT INTO ... ON DUPLICATE KEY UPDATE 4. REPLACE INTO 总结 MySQL提供了多种数据插入方式&#xff0c;每种方式在处理唯一键冲突时的行为不同&#xff0c;同时也涉及不同的锁机制。 1. INSERT INTO INSERT INTO是标准…...

AKShare学习笔记

AKShare学习笔记 本文内容参考AKShare文档。AKShare开源财经数据接口库采集的数据都来自公开的数据源&#xff0c;数据接口查询出来的数据具有滞后性。接口参考AKShare数据字典。 AKShare环境配置 安装Anaconda&#xff0c;使用Anaconda3-2019.07版本包&#xff0c;配置清华数…...

A星寻路算法

A星寻路算法简介 A星寻路算法&#xff08;A* Search Algorithm&#xff09;是一种启发式搜索算法&#xff0c;它在图形平面上进行搜索&#xff0c;寻找从起始点到终点的最短路径。A星算法结合了广度优先搜索&#xff08;BFS&#xff09;和最佳优先搜索&#xff08;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 的常用方法&#xff1a; e…...

Spark中使用DataFrame进行数据转换和操作

Apache Spark是一个强大的分布式计算框架&#xff0c;其中DataFrame是一个核心概念&#xff0c;用于处理结构化数据。DataFrame提供了丰富的数据转换和操作功能&#xff0c;使数据处理变得更加容易和高效。本文将深入探讨Spark中如何使用DataFrame进行数据转换和操作&#xff0…...

windows11新装机,简单评测系统自带软件(基本涵盖日常所需应用)

新年将近&#xff0c;由于当年安排的失误&#xff0c;系统盘&#xff08;100G&#xff09;和照片视频盘&#xff08;4T&#xff09;容量不够了&#xff0c;大容量的那块机械盘放在机箱里就在耳朵根吵吵&#xff0c;烦得很&#xff0c;于是狠狠心决定扩容后重配重装。 2023年最后…...

概念解析 | Shapley值及其在深度学习中的应用

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Shapley值及其在深度学习中的应用。 1 背景介绍 在机器学习和数据分析中,理解模型的预测是非常重要的。尤其是在深度学习黑盒模型中,我们往往难以直观地理解模型的预测行为。为…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...