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": "操作成功"
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/590664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSON.parseObject强制将自动转化的Intage型设置为Long型

通过Redis或Caffeine存储入json型String&#xff0c;通过JSON.parseObject自动类型转化之后&#xff0c;数值会优先转为Intage&#xff0c;如果存入的字符值大于Intage最大值&#xff0c;会自动转为Long型&#xff1b; 需求是&#xff1a;实要取出时数值类型值为Long&#xff1…

docker的安装以及使用经验

文章目录 一 前言1 关于环境2 关于docker的版本 二 centos在线安装2.1 添加docker源2.2 安装docker引擎安装指定的docker版本安装最新版本 三 centos离线安装四 windows安装五 写在最后 一 前言 2023年最后一天&#xff0c;一个朋友问我&#xff0c;关于docker安装的事情&…

JAVA反序列化之URLDNS链分析

简单介绍下urldns链 在此之前最好有如下知识&#xff0c;请自行bing or google学习。 什么是序列化 反序列化 &#xff1f;特点&#xff01; java对象反射调用&#xff1f; hashmap在java中是一种怎样的数据类型&#xff1f; dns解析记录有那…

tp5+workman(GatewayWorker) 安装及使用

一、安装thinkphp5 1、宝塔删除php禁用函数putenv、pcntl_signal_dispatch、pcntl_wai、pcntl_signal、pcntl_alarm、pcntl_fork&#xff0c;执行安装命令。 composer create-project topthink/think5.0.* tp5 --prefer-dist 2、配置好站点之后&#xff0c;浏览器打开访问成…

有道翻译web端 爬虫, js

以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…

消息中间件常见知识点

一&#xff1a;消息队列的主要作用是什么&#xff1f; 1.消息队列的特性&#xff1a; 业务无关&#xff0c;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行…

华为OD机试 - Wonderland(Java JS Python C)

题目描述 Wonderland是小王居住地一家很受欢迎的游乐园。Wonderland目前有4种售票方式,分别为一日票(1天)、三日票(3天)、周票(7天)和月票(30天)。 每种售票方式的价格由一个数组给出,每种票据在票面时限内可以无限制地进行游玩。例如: 小王在第10日买了一张三日票…

【Spring之创建对象源码分析】

Spring之内部创建对象源码分析 1. 看源码(AbstractBeanFactory)2. 解析 1. 看源码(AbstractBeanFactory) SuppressWarnings("unchecked")protected <T> T doGetBean(String name, Nullable Class<T> requiredType, Nullable Object[] args,boolean type…

如何在2024年编写Android应用程序

如何在2024年编写Android应用程序 本文将介绍以下内容&#xff1a; 针对性能进行优化的单活动多屏幕应用程序 &#x1f92b;&#xff08;没有片段&#xff09;。应用程序架构和模块化 → 每个层面。Jetpack Compose 导航。Firestore。应用程序架构&#xff08;模块化特征驱动…

使用Python embeddable package 版(嵌入式、绿色版)分发自己的python程序

1、Python embeddable package 版介绍 https://www.python.org/downloads/windows/ Download Windows embeddable package (32-bit) 这个版本又称为嵌入式版&#xff0c;绿色版。该版本就是一个zip压缩包&#xff0c;解压缩之后得到一个文件夹&#xff0c;该文件夹包含了一个…

力扣139.单词拆分

思路&#xff1a;动态规划&#xff0c;设dp[]记录当前字符能不能通过字典里的单词到达&#xff0c;双层循环&#xff0c;外层循环遍历字符串每一个字符&#xff0c;内层遍历当前i字符之前的所有以i字符结尾的子串 例如字符串&#xff1a;leetcode i遍历到了t 那么内层循环就…

【C++】STL 容器 - map 关联容器 ③ ( map 容器常用 api 操作 | map 容器迭代器遍历 | map#insert 函数返回值处理 )

文章目录 一、map 容器迭代器遍历1、map 容器迭代器2、代码示例 二、map 容器插入结果处理1、map#insert 函数返回值处理2、代码示例 一、map 容器迭代器遍历 1、map 容器迭代器 C 语言中 标准模板库 ( STL ) 的 std::map 容器 提供了 begin() 成员函数 和 end() 成员函数 , 这…

Seata服务搭建与模式实现

日升时奋斗&#xff0c;日落时自省 目录 1、简述 2、Seata优越性 3、Seata组成 4、Seata模式 4.1、XA 模式 4.2、AT 模式(默认模式) 4.3、TCC 模式 4.4、SAGA 模式 4.5、XA协议 5、Seata服务部署 5.1、文件数据源部署 5.1.1、下载并安装Seata 5.1.2、启动Seata服…

【前端】JQuery(学习笔记)

一、JQuery概述 1、JQuery框架 JQuery&#xff1a;一个JavaScript框架。简化JS开发 JavaScript框架&#xff1a;本质上就是一些js文件&#xff0c;封装了js的原生代码 2、JQuery版本 1&#xff09;1.x 兼容ie678,使用最为广泛的&#xff0c;官方只做BUG维护&#xff0c;功…

Ts自封装WebSocket心跳重连

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;允许客户端和服务器之间进行双向实时通信。 所谓心跳机制&#xff0c;就是在长时间不使用WebSocket连接的情况下&#xff0c;通过服务器与客户端之间按照一定时间间隔进行少量数据的通信来达到确认连接稳定的手…

【PostgreSQL】从零开始:(四十二)系统列

PostgreSQL 中的系统列 PostgreSQL 中的系统列是一组特殊的列&#xff0c;用于存储关于表和视图的元数据信息。这些列是由 PostgreSQL 数据库自动创建和维护的&#xff0c;并且不能直接修改或删除。 每个表都有多个系统列&#xff0c;这些列由系统隐式定义。因此&#xff0c;…

目标检测YOLO实战应用案例100讲-基于小样本学习的光伏红外图像缺陷 检测

目录 前言 国内外研究现状 光伏智能运维发展现状 航拍图像光伏检测研究现状

HarmonyOS4.0系统性深入开发11通过message事件刷新卡片内容

通过message事件刷新卡片内容 在卡片页面中可以通过postCardAction接口触发message事件拉起FormExtensionAbility&#xff0c;然后由FormExtensionAbility刷新卡片内容&#xff0c;下面是这种刷新方式的简单示例。 在卡片页面通过注册Button的onClick点击事件回调&#xff0c;…

数据库中的时间和前台展示的时间不一样,如何保存日期格式的数据到数据库? 如何展示数据库的日期数据到前台

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; ✈️公众号 | 热爱技术的小郑 文章底部有个人公众号二维码。回复 Java全套视频教程 或 前端全套视频教程 即可获取 300G 教程资料…

【深入浅出RocketMQ原理及实战】「云原生升级系列」打造新一代云原生“消息、事件、流“统一消息引擎的融合处理平台

打造新一代云原生"消息、事件、流"统一消息引擎的融合处理平台 云原生架构RocketMQ的云原生架构实现RocketMQ的云原生发展历程互联网时期的诞生无法支持云原生的能力 云原生阶段的升级云原生升级方向促进了Mesh以及多语言化发展可分合化的存算分离架构存储分离架构的…