| 
 
| //1.1关键字搜索 if (searchMap.get("keywords")!=null){
 MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name",searchMap.get("keywords"));
 boolQueryBuilder.must(matchQueryBuilder);
 }
 //1.2商品过滤分类
 if(searchMap.get("category")!=null){
 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("categoryName",searchMap.get("category"));
 boolQueryBuilder.filter(termQueryBuilder);
 }
 //1.3品牌过滤分类
 if (searchMap.get("brand")!=null){
 TermQueryBuilder termQueryBuilder =QueryBuilders.termQuery("brandName",searchMap.get("brand"));
 boolQueryBuilder.filter(termQueryBuilder);
 }
 
 //1.4规格过滤
 for (String key:searchMap.keySet()){
 if (key.startsWith("spec.")){
 TermQueryBuilder termQueryBuilder =QueryBuilders.termQuery(key+".keyword",searchMap.get(key));
 boolQueryBuilder.filter(termQueryBuilder);
 }
 }
 //1.5价格过滤
 if (searchMap.get("price")!=null){
 String[] price = searchMap.get("price").split("-");
 if (!price[0].equals("0")){
 RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price").gte(price[0] + "00");
 boolQueryBuilder.filter(rangeQueryBuilder);
 }
 }
 searchSourceBuilder.query(boolQueryBuilder);
 //分页
 Integer pageNo = Integer.parseInt(searchMap.get("pageNo"));
 Integer pageSize = 20;
 int fromIndex=  (pageNo-1)*pageNo;
 searchSourceBuilder.from(fromIndex);
 searchSourceBuilder.size(pageSize);
 
 //排序
 String sort = searchMap.get("sort");
 String sortOrder = searchMap.get("sortOrder");
 if (!"".equals(sort)){
 searchSourceBuilder.sort(sort, SortOrder.valueOf(sortOrder));
 }
 //高亮显示
 HighlightBuilder highlightBuilder =new HighlightBuilder();
 highlightBuilder.field("name").preTags("<font style='color:red'>").postTags("</font>");
 searchSourceBuilder.highlighter(highlightBuilder);
 
 
 
 searchRequest.source(searchSourceBuilder);
 //聚合查询(商品分类)
 TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("sku_category").field("categoryName");
 searchSourceBuilder.aggregation(termsAggregationBuilder);
 
 
 
 
 
 
 //2.0封装查询结果
 Map resultMap = new HashMap();
 SearchResponse searchResponse = null;
 try {
 searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
 SearchHits hits = searchResponse.getHits();
 long totalHits = hits.getTotalHits();//总记录数
 SearchHit[] searchHits = hits.getHits();
 List<Map<String,Object>> resultList=new ArrayList<Map<String, Object>>();
 for (SearchHit searchHit : searchHits) {
 Map<String, Object> skuMap = searchHit.getSourceAsMap();
 Map<String, HighlightField> highlightFields = searchHit.getHighlightFields(); //获取高亮结果集
 HighlightField name = highlightFields.get("name"); //获取高亮字段
 if (name!=null){
 Text[] fragments = name.fragments();  //获取高亮结果
 skuMap.put("name",fragments[0].toString());
 }
 
 resultList.add(skuMap);
 }
 resultMap.put("rows",resultList);
 
 //商品分类
 Aggregations aggregations = searchResponse.getAggregations();
 Map<String, Aggregation> aggregationMap = aggregations.getAsMap();
 Terms terms =(Terms) aggregationMap.get("sku_category");
 List<? extends Terms.Bucket> buckets = terms.getBuckets();
 List<String>  categoryList = new ArrayList<>();
 for (Terms.Bucket bucket : buckets) {
 categoryList.add(bucket.getKeyAsString());
 }
 resultMap.put("categoryList",categoryList);
 String categoryName ="";  //商品分类名称
 if (searchMap.get("category")==null){
 if (categoryList.size()>0){
 categoryName=categoryList.get(0);
 }
 } else {
 categoryName=searchMap.get("category");
 }
 //2.3品牌列表封装
 if (searchMap.get("brand")==null){
 List<Map>  brandList=   brandMapper.findListByCategoryName(categoryName);
 resultMap.put("brandList",brandList);
 }
 
 //2.4 规格数据
 List<Map> specList = specMapper.findListByCategoryName(categoryName);
 for (Map spec:specList){
 String[] options =( (String)spec.get("options")).split(",");
 spec.put("options",options);
 }
 resultMap.put("specList",specList);
 long totalCount =hits.getTotalHits(); //总记录数
 long pageCount = (totalCount%pageSize==0 )?totalCount/pageSize:(totalCount/pageSize+1);//总页数
 resultMap.put("totalPages",pageCount);
 
 } catch (IOException e) {
 }
 
 return resultMap ;
 }
 | 
 |