SpringCloud商城day07 商品搜索-2021-10-12
一.关键词查询
1. 实现思路:
2. search微服务查询接口: com.changgou.search.service.SearchServiceImpl.java
(1) Map封装返回结果: 分页功能的实现Map封装查询条件: 关键字 / 品牌 / 规格 / 销量 / 价格区间..(2) @Servicepublic class SearchServiceImple implemtns SearchServiec{//注入ES模板类完成查询@Autowiredprivate ElasticSearchTemplate elasticsearchTemplate; @Overridepublic Map search(Map<String, String> searchMap){ //查询结果封装mapMap<String, String> resultMap = new HashMap<>();if(searchMap!=null){//参数1: 条件对象NativeSearchQuery nativesSearchQueryBuilder = new NativeSearchQueryBuilder();//拼接查询条件BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//按照关键字查询if(StringUtils.isNotEmpty(searchMap.get("keyword"))){//模糊匹配查询 商品name域;值boolQuery.must(QueryBuilders.matchQuery("name", searchMap.get("keywords").operator(Operator.AND));}//封装查询条件nativeSearchQueryBuilder.withQuery(boolQuery);//参数2: 查询实体类//参数3: 结果操作对象//开启查询AggregatedPage<SkuInfo> resultInfo = elasticsearchTemplate.queryForPage(nativeSearchQueryBuilder(), SkuInfo.class, new SearchResultMapper(){//参数3接口的方法重写, 查询结果@Overridepublic<T> AggregatedPage<T> mapResults(SearchResponse searchResponse, Class<T> aClass, Pageable pageable){//结果查询集合List<T> list = new ArrayList<>();//数据命中SearchHits hits = searchResponse.getHits();//遍历命中记录, 得到索引库的每一个docs, 即商品for(SearchHit hit : hits){//hit数据的json格式转换为skuInfoSkuInfo skuInfo = JSON.parseObject(hit.getSourceAsString(), SkuInfo.class);list.add((T)skuInfo);} }return new AggregatedPageImpl<T>(list, pageable, hits.getTotalHits(), searchResponse.getAggregation());}});//封装返回结果,总记录数resultMap.put("total", resultInfo.getTotalElements()); //总记录数resultMap.put("totalPage", resultInfo.getTotalPages()): //总页数resultMap.put("rows", resultInfo.getContent()); //数据集合return resultMap;}return null;}
3. search.controller.SearchController.java
@RestController
@RequestMapping("/search")
public class SearchController{@Autowiredprivate SearchService searchService;@GetMapping()public Map search(@RequestParam Map<String,String> searchMap){//特殊符号处理: get请求传参在路径上 -> 值会被编码解码this.handleSearchMap(searchMap);Map searchResult = searchService.search(searchMap);//总记录数/页数/数据量return searchResult;}//方法实现//对搜索入参带有特殊符号进行处理public void handlerSearchMap(Map<String,String> searchMap){if(null != searchMap){//获取键值对集合Set<Map.Entry<String, String>> entries = searchMap.entrySet();//遍历for (Map.Entry<String, String> entry : entries) {//如果以规格名开头, 则转换if(entry.getKey().startsWith("spec_")){//转换"+"为 "%2BsearchMap.put(entry.getKey(),entry.getValue().replace("+","%2B"));}}}}
}
二. 条件筛选
1. 品牌过滤:
(1) 修改 com.changgou.search.service.impl.SearchServiecImpl.java//按品牌过滤查询if(StringUtils.isNotEmpty(searchMap.get("brand"))){//过滤精确查询boolQuery.filter(QueryBuilders.termQuery("brandName", searchMap.get("brand")));}//对品牌域分组查询 -> 聚合查询String skuBrand = "skuBrand";//条件查询对象 -> 聚合(分组(列名).(需要分组的域名)) nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms(skuBrand).field("brandName));//封装品牌分组结果 -> 聚合查询的列名StringTerms brandTerms = (StringTerms)resultInfo.getAggregation(skuBrand);//封装数据到集合, 返回给前端 -> 流运算->遍历得到品牌 -> 转换集合保存List<String> brandList = brandTerms.getBuckets().stream().map(bucket->bucket.getKeyAsString()).colletct(Collectors.toList());//封装到结果mapresultMap.put("brandList", brandList);
三. 规格过滤 -> 数据操作问题
1. 规格信息 -> 多次筛选 -> 约定规格名 -> 前缀 "spec_" -> 提取spec_开头的字段 ->符合则判断为规格信息
2. 操作域的拼接: SpecMap.specName.keyword
(1)修改com.changgou.search.service.SearchServiceImpl.java//按照规格进行过滤查询for(String key: searchMap.keySet()){if(key.startsWith("spec_"){//编码解码String value = searchMap.get(key).replace("%2B", "+");//过滤精确查询 -> 查询(规格域名, 具体指)boolQuery.filter(QueryBuilders.termQuery("specMap."+key.subString(5)+".keyword"), value));}}(2) 规格也需要分组/聚合查询 -> 随着搜索结果的改变而变化修改SearchServiceImpl.java//按照规格查询String skuSpec= "skuSpec";nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms(skuSpec).field("spec.keyword);//封装规格分组结果StringTerms specTerms = (StringTerms)resultInfo.getAggregation(skuSpec);List<String> specList = specTerms.getBuckets().stream().map(bucket->bucket.getKeyAsString()).toCollect(Collectors.toList());resultMap.put("specList", specList);
四. 价格区间搜索 -> 聚合查询
1. 需求: 用户选择价格区间 -> 切割价格区间字符串 -> 得到数组的两个元素 -> 价格区间作为过滤条件 -> 如果切割后的数组长度为1, 条件是>=3000
2.实现:
(1) search微服务添加价格区间过滤方法 com.changgou.search.serivce.impl.SearchServiceImpl.javaif(StringUtils.isNotEmpty(searchMap.get("price"))){String[] prices = searchMap.get("get").split("-");//0-500元...if(prices.length==2){ //小于等于第二个元素boolQuery.filter(QueryBuilders.rangeQuery("price").lte(prices[1]));}//数组长度不为2, >=3000元, 大于等于第一个元素boolQuery.filter(QueryBuilders.rangeQuery("price").gte(prices[0]);}
五. 分页查询
1. 前端传递参数(当前页+每页显示数)
2. 实现:
(1)修改SearchServiceImple.java -> 开启分页查询//当前页String pageNum = searchMap.get("pageNum");//每页显示数String pageSize = searchMap.get("pageSize");//默认第1页if(StringUtils.isEmpty(pageNum)){pageNum="1";}//默认30页if(StringUtils.isEmpty(pageSize)){pageSize="30"; }(2) //设置分页, 当前页从0开始, 每页显示条数nativeSearchQueryBuilder.withPageable(PageRequest.of(Integer.parseInt(pageNum)-1, Integer.parseInt(pageSize)));(3)返回当前页//封装当前页resultMap.put("pageNum", pageNum)
六. 排序查询
1. 分类: 销量排序 / 新品排序 /评价排序
(1). 价格: 降序(高->低), 升序(低->高)(2). 评价: 好中 差评 -> 数据库3个列 -> 记录评价数量 -> 排序时按照好评的比例排序 -> 条数限制(评价数>N条)(3). 新品: 商品发布时间 / 更新时间(4). 销量: 销售数量 -> 时间段限制
(1) 修改SearchServiceImpl.java//按照相关字段排序查询//1.当前域 2.升序ASC / 降序DESC if(StringUtils.isNotEmpty(searchMap.get("sortField"))&&StringUtils.isNotEmpty("sortRule"))){//升序if("ASC".equals(searchMap.get("sortRule"))){//条件查询对象nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(searchMap.get("sortField))).order(SortOrder.ASC));}else{nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(searchMap.get("sortField))).order(SortOrder.DESC));}
}
七. 高亮查询
1. 关键词添加html标签(color red) -> 高亮显示搜索条件
2. 通过ES指定高亮域 -> 指定前后缀/html样式 -> 高亮搜索 -> 高亮数据替换非高亮
3.实现:
(1) 基于nativeSearchQueryBuilder对象 -> 设置高亮域 -> 高亮样式HighlightBuilder.Field field = new HighlightBuilder.Field("name") //高亮域.preTags("<span style='color:red'>") //高亮前缀.postTags("</span>"); //高亮后缀nativeSearchQueryBuilder.withHighlighFields(fields);(2) 高亮数据替换非高亮数据Map<String, HighlightField> highlightFields = hit.getHighLightFields(); //得到高亮域if(highlightFields !=null&&highlightFields.size()>0){//替换数据skuInfo.setName(highlightFields.get("name").getFragmetns()[0].toString());}
SpringCloud商城day07 商品搜索-2021-10-12相关推荐
- 电动力学每日一题 2021/10/12
电动力学每日一题 2021/10/12 (a) To make the EM field trapped inside a perfectly electric conducting cavity, ...
- (转)淘淘商城系列——商品搜索功能测试
http://blog.csdn.net/yerenyuan_pku/article/details/72941506 到这里,我相信大家也是不容易,我自己也算是很不容易写到这里,希望自己能一直写下去 ...
- (转)淘淘商城系列——商品搜索功能Service实现
http://blog.csdn.net/column/details/15737.html 首先我们在taotao-search-interface工程中新建一个SearchService接口,并在 ...
- (转)淘淘商城系列——商品搜索功能表现层实现
http://blog.csdn.net/yerenyuan_pku/article/details/72913431 首先我们在taotao-search-web工程中需要添加对搜索服务的引用,如下 ...
- (转)淘淘商城系列——商品搜索功能Dao实现
http://blog.csdn.net/yerenyuan_pku/article/details/72909286 终于进入商品搜索功能的开发中了,本文我来教大家编写实现商品搜索功能的Dao层代码 ...
- 尚硅谷2020微服务分布式电商项目《谷粒商城》-商品搜索
关注公众号:java星星 获取全套课件资料 1. 导入商品数据 1.1. 搭建搜索工程 pom.xml内容如下: <?xml version="1.0" encoding=& ...
- 2021.10.12 lesson06——母婴商场分析
母婴商场的可行性分析 **参考文献 一.编写目的 二.项目背景 三.可行性研究的前提 1.要求 2.目标 3.可行性研究方法 四.所建设技术可行性分析 1.系统的简要描述 2.处理流程和数据流程 3. ...
- 京东商城API 商品搜索接口
接口标识 接口地址: 返回格式:json 请求方式:HTTP GET POST 请求示例:https://api03.6bqb.com/jd/search?apikey=<您自己的apikey& ...
- 第57课 鸡兔同笼-2021.10.12
#include<iostream> using namespace std; int main() {int ji,tu;for(ji=0;ji<=35;ji++)for(tu=0 ...
最新文章
- Linux服务器优化(转)
- java 多态判断非空_跳槽涨薪季面试题之java基础(一)
- Ubuntu配置远程访问的xrdp协议和teamviewer软件
- Problems you may meet
- 鸿蒙开发还可以用安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
- java 循环对比_Java stream 和 for 循环效率对比问题
- Docker笔记四 发布自制DockerImage 到 Dockerhub
- 微信跳wap php_微信跳转wap外部浏览器接口如何实现
- Android系统源代码目录
- mysql 启动失败 必须删除idb文件_MySQL删除idb文件引发的思考-阿里云开发者社区...
- 计算机的ctrl按键,与Ctrl相关的电脑快捷键大全
- 被食者与食者系统matlab,捕食者与被捕食者模型——Logistic-Volterra
- Onvif协议学习:14、球机云台控制PTZ
- python 合成gif与拆分gif为png图片
- 理解O(log2N)和O(Nlog2N)
- 查看服务器配置以及常用命令
- java卡牌游戏详解
- 详解DNS(理论篇)
- php个人博客程序推荐,推荐五款不错的个人博客程序
- 经典面试题扔鸡蛋(Google面试题附带LeetCode例题)
热门文章
- MoveWindow() SetWindowPos()的区别与联系
- 马云考计算机吗,大佬与高考:马云三次高考 马化腾弃天文选计算机
- c语言扫雷(强化版)(可展开)(后附完整代码)
- 到底PS和AI有什么区别 UI设计学习路线是什么
- linux内网穿梭无法使用,教你在 Linux 下时光穿梭
- 使用InstallUtil安装WINDOWS服务时,会被360木马防火墙阻止。
- jaxb xml 生成 java_使用 JAXB 工具根据 Java 类生成 XML 模式
- 基于Python多用户B2C商城系统设计与实现 开题报告
- 如何让手机的增强型4GLTE开关默认处于关闭状态?
- vim 注意ctrl+s