一.关键词查询

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相关推荐

  1. 电动力学每日一题 2021/10/12

    电动力学每日一题 2021/10/12 (a) To make the EM field trapped inside a perfectly electric conducting cavity, ...

  2. (转)淘淘商城系列——商品搜索功能测试

    http://blog.csdn.net/yerenyuan_pku/article/details/72941506 到这里,我相信大家也是不容易,我自己也算是很不容易写到这里,希望自己能一直写下去 ...

  3. (转)淘淘商城系列——商品搜索功能Service实现

    http://blog.csdn.net/column/details/15737.html 首先我们在taotao-search-interface工程中新建一个SearchService接口,并在 ...

  4. (转)淘淘商城系列——商品搜索功能表现层实现

    http://blog.csdn.net/yerenyuan_pku/article/details/72913431 首先我们在taotao-search-web工程中需要添加对搜索服务的引用,如下 ...

  5. (转)淘淘商城系列——商品搜索功能Dao实现

    http://blog.csdn.net/yerenyuan_pku/article/details/72909286 终于进入商品搜索功能的开发中了,本文我来教大家编写实现商品搜索功能的Dao层代码 ...

  6. 尚硅谷2020微服务分布式电商项目《谷粒商城》-商品搜索

    关注公众号:java星星 获取全套课件资料 1. 导入商品数据 1.1. 搭建搜索工程 pom.xml内容如下: <?xml version="1.0" encoding=& ...

  7. 2021.10.12 lesson06——母婴商场分析

    母婴商场的可行性分析 **参考文献 一.编写目的 二.项目背景 三.可行性研究的前提 1.要求 2.目标 3.可行性研究方法 四.所建设技术可行性分析 1.系统的简要描述 2.处理流程和数据流程 3. ...

  8. 京东商城API 商品搜索接口

    接口标识 接口地址: 返回格式:json 请求方式:HTTP GET POST 请求示例:https://api03.6bqb.com/jd/search?apikey=<您自己的apikey& ...

  9. 第57课 鸡兔同笼-2021.10.12

    #include<iostream> using namespace std; int main() {int ji,tu;for(ji=0;ji<=35;ji++)for(tu=0 ...

最新文章

  1. Linux服务器优化(转)
  2. java 多态判断非空_跳槽涨薪季面试题之java基础(一)
  3. Ubuntu配置远程访问的xrdp协议和teamviewer软件
  4. Problems you may meet
  5. 鸿蒙开发还可以用安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  6. java 循环对比_Java stream 和 for 循环效率对比问题
  7. Docker笔记四 发布自制DockerImage 到 Dockerhub
  8. 微信跳wap php_微信跳转wap外部浏览器接口如何实现
  9. Android系统源代码目录
  10. mysql 启动失败 必须删除idb文件_MySQL删除idb文件引发的思考-阿里云开发者社区...
  11. 计算机的ctrl按键,与Ctrl相关的电脑快捷键大全
  12. 被食者与食者系统matlab,捕食者与被捕食者模型——Logistic-Volterra
  13. Onvif协议学习:14、球机云台控制PTZ
  14. python 合成gif与拆分gif为png图片
  15. 理解O(log2N)和O(Nlog2N)
  16. 查看服务器配置以及常用命令
  17. java卡牌游戏详解
  18. 详解DNS(理论篇)
  19. php个人博客程序推荐,推荐五款不错的个人博客程序
  20. 经典面试题扔鸡蛋(Google面试题附带LeetCode例题)

热门文章

  1. MoveWindow() SetWindowPos()的区别与联系
  2. 马云考计算机吗,大佬与高考:马云三次高考 马化腾弃天文选计算机
  3. c语言扫雷(强化版)(可展开)(后附完整代码)
  4. 到底PS和AI有什么区别 UI设计学习路线是什么
  5. linux内网穿梭无法使用,教你在 Linux 下时光穿梭
  6. 使用InstallUtil安装WINDOWS服务时,会被360木马防火墙阻止。
  7. jaxb xml 生成 java_使用 JAXB 工具根据 Java 类生成 XML 模式
  8. 基于Python多用户B2C商城系统设计与实现 开题报告
  9. 如何让手机的增强型4GLTE开关默认处于关闭状态?
  10. vim 注意ctrl+s