品牌、规格统计

品牌、规格统计与前一篇的种类分组统计是一样的,只需要进行分组查询,指定terms并根据terms获取统计结果即可,因此给出代码不在赘述
注意利用Bucket可以获得具体的结果

public Map search(Map<String, String> searchMap) {//1.获取关键字的值String keywords = searchMap.get("keywords");if (StringUtils.isEmpty(keywords)) {keywords = "华为";//赋值给一个默认的值}//2.创建查询对象 的构建对象NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();//3.设置查询的条件//设置分组条件  商品分类nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("skuCategorygroup").field("categoryName").size(50));//设置分组条件  商品品牌nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("skuBrandgroup").field("brandName").size(50));//设置分组条件  商品的规格nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("skuSpecgroup").field("spec.keyword").size(100));nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("name", keywords));//4.构建查询对象NativeSearchQuery query = nativeSearchQueryBuilder.build();//5.执行查询AggregatedPage<SkuInfo> skuPage = esTemplate.queryForPage(query, SkuInfo.class);//获取分组结果  商品分类StringTerms stringTermsCategory = (StringTerms) skuPage.getAggregation("skuCategorygroup");//获取分组结果  商品品牌StringTerms stringTermsBrand = (StringTerms) skuPage.getAggregation("skuBrandgroup");//获取分组结果  商品规格数据StringTerms stringTermsSpec = (StringTerms) skuPage.getAggregation("skuSpecgroup");List<String> categoryList = getStringsCategoryList(stringTermsCategory);List<String> brandList = getStringsBrandList(stringTermsBrand);Map<String, Set<String>> specMap = getStringSetMap(stringTermsSpec);//6.返回结果Map resultMap = new HashMap<>();resultMap.put("specMap", specMap);resultMap.put("categoryList", categoryList);resultMap.put("brandList", brandList);resultMap.put("rows", skuPage.getContent());resultMap.put("total", skuPage.getTotalElements());resultMap.put("totalPages", skuPage.getTotalPages());return resultMap;
}/*** 获取品牌列表** @param stringTermsBrand* @return*/
private List<String> getStringsBrandList(StringTerms stringTermsBrand) {List<String> brandList = new ArrayList<>();if (stringTermsBrand != null) {for (StringTerms.Bucket bucket : stringTermsBrand.getBuckets()) {brandList.add(bucket.getKeyAsString());}}return brandList;
}/*** 获取分类列表数据** @param stringTerms* @return*/
private List<String> getStringsCategoryList(StringTerms stringTerms) {List<String> categoryList = new ArrayList<>();if (stringTerms != null) {for (StringTerms.Bucket bucket : stringTerms.getBuckets()) {String keyAsString = bucket.getKeyAsString();//分组的值categoryList.add(keyAsString);}}return categoryList;
}/*** 获取规格列表数据** @param stringTermsSpec* @return*/
private Map<String, Set<String>> getStringSetMap(StringTerms stringTermsSpec) {Map<String, Set<String>> specMap = new HashMap<String, Set<String>>();Set<String> specList = new HashSet<>();if (stringTermsSpec != null) {for (StringTerms.Bucket bucket : stringTermsSpec.getBuckets()) {specList.add(bucket.getKeyAsString());}}for (String specjson : specList) {Map<String, String> map = JSON.parseObject(specjson, Map.class);for (Map.Entry<String, String> entry : map.entrySet()) {//String key = entry.getKey();        //规格名字String value = entry.getValue();    //规格选项值//获取当前规格名字对应的规格数据Set<String> specValues = specMap.get(key);if (specValues == null) {specValues = new HashSet<String>();}//将当前规格加入到集合中specValues.add(value);//将数据存入到specMap中specMap.put(key, specValues);}}return specMap;
}

条件筛选

分类与品牌筛选

这是一个过滤查询,或者说是布尔查询的过程,依赖的是BoolQueryCuilder类,主要涉及新建对象、设置过滤内容和为查询对象设置过滤查询三个步骤

 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.filter(QueryBuilders.termQuery("brandName", searchMap.get("brand")));nativeSearchQueryBuilder.withFilter(boolQueryBuilder);

完整代码如下

@Override
public Map search(Map<String, String> searchMap) {//1.获取关键字的值String keywords = searchMap.get("keywords");if (StringUtils.isEmpty(keywords)) {keywords = "华为";//赋值给一个默认的值}//2.创建查询对象 的构建对象NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();//3.设置查询的条件//设置分组条件  商品分类nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("skuCategorygroup").field("categoryName").size(50));//设置分组条件  商品品牌nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("skuBrandgroup").field("brandName").size(50));//设置分组条件  商品的规格nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("skuSpecgroup").field("spec.keyword").size(1000));//设置主关键字查询nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("name", keywords));BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();if (!StringUtils.isEmpty(searchMap.get("brand"))) {boolQueryBuilder.filter(QueryBuilders.termQuery("brandName", searchMap.get("brand")));}if (!StringUtils.isEmpty(searchMap.get("category"))) {boolQueryBuilder.filter(QueryBuilders.termQuery("categoryName", searchMap.get("category")));}//构建过滤查询nativeSearchQueryBuilder.withFilter(boolQueryBuilder);//4.构建查询对象NativeSearchQuery query = nativeSearchQueryBuilder.build();//5.执行查询AggregatedPage<SkuInfo> skuPage = esTemplate.queryForPage(query, SkuInfo.class);//获取分组结果  商品分类StringTerms stringTermsCategory = (StringTerms) skuPage.getAggregation("skuCategorygroup");//获取分组结果  商品品牌StringTerms stringTermsBrand = (StringTerms) skuPage.getAggregation("skuBrandgroup");//获取分组结果  商品规格数据StringTerms stringTermsSpec = (StringTerms) skuPage.getAggregation("skuSpecgroup");List<String> categoryList = getStringsCategoryList(stringTermsCategory);List<String> brandList = getStringsBrandList(stringTermsBrand);Map<String, Set<String>> specMap = getStringSetMap(stringTermsSpec);//6.返回结果Map resultMap = new HashMap<>();resultMap.put("specMap", specMap);resultMap.put("categoryList", categoryList);resultMap.put("brandList", brandList);resultMap.put("rows", skuPage.getContent());resultMap.put("total", skuPage.getTotalElements());resultMap.put("totalPages", skuPage.getTotalPages());return resultMap;
}

价格过滤

分类与品牌过滤BoolQueryBuilder采用的是QueryBuildersterms,而价格过滤采用 的是range

//价格过滤查询
String price = searchMap.get("price");
if (!StringUtils.isEmpty(price)) {String[] split = price.split("-");if (!split[1].equalsIgnoreCase("*")) {boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").from(split[0], true).to(split[1], true));} else {boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(split[0]));}
}

以上所有的过滤、分页都是对查询对象的builder对象进行了设置,这样通过build方法就可以直接输出符合要求的查询对象

搜索分页

过滤查询用的是withFilter方法,分页是用withPageable方法

 //略//构建过滤查询nativeSearchQueryBuilder.withFilter(boolQueryBuilder);//构建分页查询Integer pageNum = 1;if (!StringUtils.isEmpty(searchMap.get("pageNum"))) {try {pageNum = Integer.valueOf(searchMap.get("pageNum"));} catch (NumberFormatException e) {e.printStackTrace();pageNum=1;}}Integer pageSize = 3;nativeSearchQueryBuilder.withPageable(PageRequest.of(pageNum - 1, pageSize));//略//4.构建查询对象NativeSearchQuery query = nativeSearchQueryBuilder.build();//略

搜索排序

withSort方法

//构建排序查询
String sortRule = searchMap.get("sortRule");
String sortField = searchMap.get("sortField");
if (!StringUtils.isEmpty(sortRule) && !StringUtils.isEmpty(sortField)) {nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortField).order(sortRule.equals("DESC") ? SortOrder.DESC : SortOrder.ASC));
}

高亮

修改com.changgou.search.service.impl.SkuServiceImpl的search方法搜索代码,添加高亮显示的域:

上图代码如下:

 //设置高亮条件nativeSearchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("name"));nativeSearchQueryBuilder.withHighlightBuilder(new HighlightBuilder().preTags("<em style=\"color:red\">").postTags("</em>"));//设置主关键字查询nativeSearchQueryBuilder.withQuery(QueryBuilders.multiMatchQuery(keywords,"name","brandName","categoryName"));

修改 查询的方法,自定义结果映射器,入下图:

上图图片如下:

AggregatedPage<SkuInfo> skuPage = esTemplate.queryForPage(query, SkuInfo.class, new SearchResultMapperImpl());

自定义一个映射结果类实现接口,作用就是:自定义映射结果集,获取高亮的数据展示,如下图:

代码如下:

public class SearchResultMapperImpl implements SearchResultMapper {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {List<T> content = new ArrayList<>();//如果没有结果返回为空if (response.getHits() == null || response.getHits().getTotalHits() <= 0) {return new AggregatedPageImpl<T>(content);}for (SearchHit searchHit : response.getHits()) {String sourceAsString = searchHit.getSourceAsString();SkuInfo skuInfo = JSON.parseObject(sourceAsString, SkuInfo.class);Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();HighlightField highlightField = highlightFields.get("name");//有高亮则设置高亮的值if (highlightField != null) {StringBuffer stringBuffer = new StringBuffer();for (Text text : highlightField.getFragments()) {stringBuffer.append(text.string());}skuInfo.setName(stringBuffer.toString());}content.add((T) skuInfo);}return new AggregatedPageImpl<T>(content, pageable, response.getHits().getTotalHits(), response.getAggregations(), response.getScrollId());}
}

畅购商城五:条件查询相关推荐

  1. 畅购商城(五):Elasticsearch实现商品搜索

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...

  2. 商品品牌信息的增删改查操作步骤_畅购商城(三):商品管理

    好好学习,天天向上 本文已收录至我的Github仓库 DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 畅购商城(一):环境搭建 畅购商城(二):分布式文件系统 ...

  3. 畅购商城(十三):秒杀系统「上」

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 畅购商城(一):环境搭建 畅购商城(二):分布式文件系统F ...

  4. 畅购商城(三):商品管理

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 畅购商城(一):环境搭建 畅购商 ...

  5. 【畅购商城】校验用户名、手机号以及前置技术Redis和阿里大鱼短信验证码

    搭建环境 后端web服务:changgou4-service-web 修改pom.xml文档 <?xml version="1.0" encoding="UTF-8 ...

  6. Java毕业设计项目【畅购商城】

    为了帮助更多的铁汁们,快速进步,完成毕业设计,挺近大厂,我前面已经分享了很多项目 但是有铁汁们觉得实战项目不够,为了给支持我的朋友吧 此次分享的是商城项目,里面包含视频和代码,涉及到SSM.Sprin ...

  7. 畅购商城_第11章_ 订单

    畅购商城_第11章_ 订单 文章目录 畅购商城_第11章_ 订单 第11章 订单 课程内容 1 订单结算页 1.1 收件地址分析 1.2 实现用户收件地址查询 1.2.1 代码实现 1.2.2 测试 ...

  8. 畅购商城4.0 微信支付

    畅购商城4.0 1.微信支付 1.1流程分析 1.2微信支付概述 1.2.1账号申请 步骤一:注册公众号,根据自身主体类型注册对应的公众号 只能申请服务号,订阅号没有办法申请支付 https:// ...

  9. 畅购商城六:微服务网关与jwt令牌

    微服务网关 基本概念 对于微服务的各个服务一般会有不同的地址,外部客户端的一个服务可能要调用诸多的接口,这会带来以下的问题 客户端会多次请求不同的微服务,地址复杂 存在跨域请求,处理复杂 认证复杂 难 ...

最新文章

  1. scrapy---反爬虫
  2. 图像处理之简单脸谱检测算法
  3. 怎样定义网页里的关键字关键词
  4. python 多进程multiprocessing进程池pool tensorflow-yolov3 报错TypeError: 'ApplyResult' object is not iterable
  5. 在c++中使用for循环遍历map并删除map中的元素的注意事项
  6. Liunx 安装mysql 5.6.16
  7. 微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)
  8. 【转】程序在内存中的分布
  9. python中的Lambda表达式/函数
  10. C语言基础篇(零)gcc编译和预处理
  11. 持续集成最佳实践_集成服务性能最佳实践–数据流优化
  12. php markdown 电子书_PHP Markdown转PDF解决方案
  13. 简单神经网络结构一键可视化
  14. uni-app微信小程序模拟器运行到某一页面调试操作
  15. SceneFlow Dataset
  16. debian 11修改ip地址的方法
  17. php yar2,[原]PHP-yar拓展源码解读二-protocol篇
  18. 重读经典(CLIP上):《Learning Transferable Visual Models From Natural Language Supervision》
  19. OpenGL ES SDK for Android - 3
  20. cati服务器授权信息无效,cati安装

热门文章

  1. API、ABI究竟有什么区别?
  2. QTreeView/QTreeWidget设置行间距
  3. html中怎么把边框设置成花边,word怎么设置花边有多少种方法
  4. 零基础小白转行web前端,该怎么学?
  5. linux awk菜鸟教程,AWK 数组
  6. chrome android 分屏,谷歌调整安卓系统:分屏多任务同时支持两款以上APP
  7. table无限嵌套table
  8. python以原帧率播放视频_用Python做FFmpeg批处理之:指定帧率放慢/加快视频。
  9. 运营总监平时是做什么的?揭秘运营总监地位和公司排位!
  10. 为至简时代哀悼:开源商业模式之殇