SpringDataSolr技术实现高亮查询、过滤查询、分页

SpringDataSolr技术实现高亮查询、过滤查询、分页

public Map searchByParam(Map map) {
       Map itemMap = new HashMap();
       // 从solr索引库查
       // TbItem tbItem = new TbItem();

       // Query query = new SimpleQuery("item_title:" + map.get("keyword")); // keyword是从页面传来的 非高亮查询
       // ScoredPage<TbItem> scoredPage = solrTemplate.queryForPage(query, TbItem.class); 非高亮查询的结果
       // List<TbItem> itemList = scoredPage.getContent(); // 当前页数据
       // long total = scoredPage.getTotalElements();// 总条数

       // TODO 高亮显示
       SimpleHighlightQuery highlightQuery =
               new SimpleHighlightQuery(new Criteria("item_keywords").is(map.get("keyword"))); // 设置高亮查询条件

       HighlightOptions highlightOptions = new HighlightOptions();
       highlightOptions.addField("item_title"); // 高亮哪个域名
       highlightOptions.setSimplePrefix("<span style='color:red'>"); // 高亮的样式
       highlightOptions.setSimplePostfix("</span>");

       highlightQuery.setHighlightOptions(highlightOptions); // 设置高亮

       // TODO 过滤分类
       if (!map.get("category").equals("")) {
           highlightQuery.addFilterQuery(new SimpleFilterQuery(new Criteria("item_category").is(map.get("category"))));
       }
       // TODO 过滤品牌
       if (!map.get("brand").equals("")) {
           highlightQuery.addFilterQuery(new SimpleFilterQuery(new Criteria("item_brand").is(map.get("brand"))));
       }

       // TODO 过滤价格
       if (!map.get("price").equals("")) {
           // paramMap.get("price")  0-500  500-1000 3000-*
           String[] prices = map.get("price").toString().split("-");
           if (!prices[1].equals("*")) {
               highlightQuery.addFilterQuery(new SimpleFilterQuery(new Criteria("item_price").between(prices[0], prices[1], true, true)));
           } else {
               highlightQuery.addFilterQuery(new SimpleFilterQuery(new Criteria("item_price").greaterThanEqual(prices[0])));
           }
       }

       // TODO 价格排序
       if (map.get("order").equals("asc")) {
           highlightQuery.addSort(new Sort(Sort.Direction.ASC, "item_price"));
       } else {
           highlightQuery.addSort(new Sort(Sort.Direction.DESC, "item_price"));
       }

       // TODO 过滤规格 "spec":{"水杯容量":"800ml","水杯材质":"玻璃"}
       Map<String, String> specMap = (Map) map.get("spec");
       // highlightQuery.addFilterQuery(new SimpleFilterQuery(new Criteria("item_spec_水杯容量").is("800ml")));
       for (String key : specMap.keySet()) {
           highlightQuery.addFilterQuery(new SimpleFilterQuery(new Criteria("item_spec_" + key).is(specMap.get(key))));
       }

       // TODO 分页:
       Integer pageNo = (Integer) map.get("pageNo");
//        String s  = (String) map.get("pageNo");
//        Integer pageNo  = Integer.parseInt(s);
       // 每页显示60条
       highlightQuery.setOffset((pageNo - 1) * 60);//起始位置
       highlightQuery.setRows(60);//每页显示最大条数


       // highlightPage 查出来的数据很多 不是想要的
       HighlightPage<TbItem> highlightPage = solrTemplate.queryForHighlightPage(highlightQuery, TbItem.class); // 高亮查询的结果

       List<TbItem> content = highlightPage.getContent(); // 当前页数据 这里面的数据 有id title price 等等 ,title ='小米 红米1S 金属灰 联通3G手机 双卡双待' 不是想要的
       for (TbItem tbItem : content) {
           List<HighlightEntry.Highlight> highlights = highlightPage.getHighlights(tbItem); // 传入当前遍历的对象 getHighlights() 这里面有想要的数据 有 filed=item_title 和 Snipplets = <span style='color:red'>小米</span> 红米1S 金属灰 联通3G手机 双卡双待
           if (highlights.size() > 0 && highlights != null) {
               List<String> snipplets = highlights.get(0).getSnipplets();
               if (snipplets.size() > 0 && snipplets != null) {
                   String title = snipplets.get(0);
                   tbItem.setTitle(title);
               }
           }
       }

       // TODO 过滤查询
       // 使用springdataSolr分组查询,查询此关键字下的所有分类
       // select category FROM tb_item where title like '%三星%' GROUP BY category
       List<String> categoryList = new ArrayList<String>();
       Query groupQuery = new SimpleQuery(new Criteria("item_keywords").is(map.get("keyword"))); //设置关键字 相当于 where title like '%三星%'
       groupQuery.setGroupOptions(new GroupOptions().addGroupByField("item_category")); // 设置分组属性  相当于GROUP BY category

       // 查询出来的数据有很多 我们只需要分类的数据就行了 所以得一层层的获取
       GroupPage<TbItem> groupPage = solrTemplate.queryForGroupPage(groupQuery, TbItem.class);
       GroupResult<TbItem> groupResult = groupPage.getGroupResult("item_category"); // 当前页数据
       Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
       List<GroupEntry<TbItem>> content1 = groupEntries.getContent();
       for (GroupEntry<TbItem> groupEntry : content1) {
           String groupValue = groupEntry.getGroupValue();
           categoryList.add(groupValue); // 把需要的值放入List集合
       }
       itemMap.put("categoryList", categoryList); // 分类数据
       // itemMap.put("categoryList", content1.get(0).getGroupValue()); // 分类数据

       if (categoryList.size() > 0) {
           // TODO 根据分类查询品牌和规格开始  
           String itemCatName = categoryList.get(0);
           // List<Map> brandList = (List<Map>) redisTemplate.boundHashOps("cat_brand").get(itemCatName);
           // List<Map> specList = (List<Map>) redisTemplate.boundHashOps("cat_spec").get(itemCatName);
           String brandStr = (String) redisTemplate.boundHashOps("cat_brand").get(itemCatName);
           List<Map> brandList = JSON.parseArray(brandStr, Map.class);

           List opStr = (List) redisTemplate.boundHashOps("cat_spec").get(itemCatName);
           // List<Map> specList = JSON.parseArray(opStr, Map.class);

           itemMap.put("brandList", brandList);
           itemMap.put("specList", opStr);
       } else {
           itemMap.put("brandList", null);
           itemMap.put("specList", null); //  如果查不到设置为空
       }

       // List<TbItem> itemList = highlightPage.getContent();// 当前页数据 todo
       long total = highlightPage.getTotalElements();
       int totalPages = highlightPage.getTotalPages();
       itemMap.put("totalPages", totalPages);

       itemMap.put("itemList", content);
       itemMap.put("total", total);
       return itemMap;
   }

发表评论