spring-data-solr查询

根据关键字查询,过滤、排序、高亮显示

public Map<String, Object> highlightSearch(Map searchMap) {
        //获取查询关键字
        String keywords =(String) searchMap.get("keywords");
        if(keywords != null){
            keywords = keywords.replaceAll(" ","");
        }
        //获取当前页
        Integer pageNo = Integer.parseInt(String.valueOf(searchMap.get("pageNo")));
        //获取每页多少条数据
        Integer pageSize = Integer.parseInt(String.valueOf(searchMap.get("pageSize")));

        //过滤查询
        //获取页面点击分类的过滤条件
        String category = (String)searchMap.get("category");
        //获取页面点击品牌的过滤条件
        String brand = (String)searchMap.get("brand");
        //获取点击规格的过滤条件
        String spec = String.valueOf(searchMap.get("spec"));
        //获取页面点解价格区间的过滤条件
        String price = (String)searchMap.get("price");

        //获取页面排序的域(按什么字段排序)
        String sortField = String.valueOf(searchMap.get("sortField"));
        //获取页面排序的规则(升序、降序)
        String sortType = String.valueOf(searchMap.get("sort"));



        //封装查询的对象
        HighlightQuery query = new SimpleHighlightQuery();
        //查询的条件对象
        Criteria criteria = new Criteria("item_keywords").is(keywords);
        //将查询条件对象,放入查询对象中
        query.addCriteria(criteria);
        //计算当前页第一条数据的索引是几。
        if(pageNo == null || pageNo <= 0){
            pageNo = 1;
        }
        Integer start = (pageNo - 1) * pageSize;
        //设置查询对象从第几条开始查询
        query.setOffset(start);
        //设置每页多少条数据
        query.setRows(pageSize);

        //创建高亮显示对象
        HighlightOptions highlightOptions = new HighlightOptions();
        //设置哪个域需要高亮显示
        highlightOptions.addField("item_title");
        //设置高亮的前缀
        highlightOptions.setSimplePrefix("<em style = 'color:red'>");
        //设置高亮的后缀
        highlightOptions.setSimplePostfix("</em>");
        //将高亮显示对象,加入到查询对象中
        query.setHighlightOptions(highlightOptions);

        //根据分类过滤查询
        if(category != null && !"".equals(category)){
            //创建过滤对象
            FilterQuery simpleFilterQuery = new SimpleFilterQuery();
            //查询的条件对象
            Criteria filterCriteria = new Criteria("item_category").is(category);
            //将查询条件对象,放入过滤对象中
            simpleFilterQuery.addCriteria(filterCriteria);
            //过滤,放入查询对象中
            query.addFilterQuery(simpleFilterQuery);
        }

        //根据品牌过滤查询
        if(brand != null && !"".equals(brand)){
            //创建过滤对象
            FilterQuery simpleFilterQuery = new SimpleFilterQuery();
            //创建查询条件
            Criteria brandCriteria = new Criteria("item_brand").is(brand);
            //将查询条件放入过滤对象
            simpleFilterQuery.addCriteria(brandCriteria);
            //将过滤对象放入查询对象
            query.addFilterQuery(simpleFilterQuery);

        }
        //根据规格查询,spec中的数据格式:json格式
        if(spec != null && !"".equals(spec)){
            Map<String,String> specMap = JSON.parseObject(spec, Map.class);
            System.out.println(specMap);
            if(specMap != null && searchMap.size() > 0){
                Set<Map.Entry<String, String>> entries = specMap.entrySet();
                for(Map.Entry<String, String> entry : entries){
                    //创建过滤查询对象
                    FilterQuery simpleFilterQuery = new SimpleFilterQuery();
                    //创建查询条件
                    System.out.println(entry.getKey()+entry.getValue());
                    Criteria specCriteria = new Criteria("item_spec_"+entry.getKey()).is(entry.getValue());
                    //将条件对象放入过滤查询对象中
                    simpleFilterQuery.addCriteria(specCriteria);
                    //将过滤对象放入到查询对象中
                    query.addFilterQuery(simpleFilterQuery);
                }
            }
        }
        //根据价格查询
        if(price != null && !"".equals(price)){
            //切割price字符串。
            //如果价格区间为0-500元,那么切割后的数组中第一个元素的值为0,第二个值的元素为500
            String[] split = price.split("-");
            if(split != null && split.length == 2){
                //既不是第一个元素为0,也不是最后一个元素为*的其他区间,需要满足两个条件:split[0]<价格区间<split[1]。
                //如果split[0]为0,代表价格区间只需要小于split[1]这一个条件即可,所以不需要进入该if语句。
                if(!"0".equals(split[0])){
                    //创建过滤查询条件
                    FilterQuery simpleFilterQuery = new SimpleFilterQuery();
                    //创建查询条件
                    Criteria priceCriteria = new Criteria("item_price").greaterThanEqual(split[0]);
                    //将条件对象放入过滤查询对象中
                    simpleFilterQuery.addCriteria(priceCriteria);
                    //将过滤对象放入到查询对象中
                    query.addFilterQuery(simpleFilterQuery);
                }

                //如果split[1]为*,代表要查的价格区间为:split[0]以上的所有商品,所以只需要满足大于split[0]这一个条件即可。不需要进入该if语句
                if(!"*".equals(split[1])){
                    //创建过滤查询条件
                    FilterQuery simpleFilterQuery = new SimpleFilterQuery();
                    //创建查询条件
                    Criteria priceCriteria = new Criteria("item_price").lessThanEqual(split[1]);
                    //将条件对象放入过滤查询对象中
                    simpleFilterQuery.addCriteria(priceCriteria);
                    //将过滤对象放入到查询对象中
                    query.addFilterQuery(simpleFilterQuery);
                }
            }
        }


        //添加排序的条件
        if(sortField != null && sortType != null && !"".equals(sortField) && !"".equals(sortType)){
            //升序
            if("asc".equalsIgnoreCase(sortType)){
                //创建一个排序对象(枚举,一组常量的值)
                Sort sort = new Sort(Sort.Direction.ASC, "item_" + sortField);
                //将排序对象放入查询对象中
                query.addSort(sort);
            }
            //降序
            if("desc".equalsIgnoreCase(sortType)){
                //创建一个排序对象(枚举,一组常量的值)
                Sort sort = new Sort(Sort.Direction.DESC, "item_" + sortField);
                //将排序对象放入查询对象中
                query.addSort(sort);
            }
        }

        //查询并且返回结果
        HighlightPage<Item> items = solrTemplate.queryForHighlightPage(query, Item.class);

        //获取带高亮的集合
        List<HighlightEntry<Item>> highlighted = items.getHighlighted();
        //创建itemList,用来存放查出的Item
        List<Item> itemList = new ArrayList<>();
        //遍历高亮集合
        for(HighlightEntry<Item> itemHighlightEntry : highlighted){
            Item item = itemHighlightEntry.getEntity();
            //getEntity:Item [Hash = 514230796, id=1156083, title=OPPO R3(R7007)黑色 移动4G手机, sellPoint=null, ....

            List<HighlightEntry.Highlight> highlights = itemHighlightEntry.getHighlights();
            //highlights=[org.springframework.data.solr.core.query.result.HighlightEntry$Highlight@5001ef52]
            if(highlights != null && highlights.size() > 0){
                //获取高亮的标题集合
                List<String> highLightTitle = highlights.get(0).getSnipplets();
                //highLightTitle=[OPPO R3(R7007)黑色 移动4G<em style = 'color:red'>手机</em>]
                //判断高亮集合是否为空
                if(highLightTitle != null && highLightTitle.size() > 0 ){
                    //获取高亮的标题
                    String title = highLightTitle.get(0);
                    //title = OPPO R3(R7007)黑色 移动4G<em style = 'color:red'>手机</em>
                    item.setTitle(title);
                }
            }
            itemList.add(item);
        }

        Map<String, Object> resultMap = new HashMap<>();
        //查询到的结果集
        resultMap.put("rows",itemList);
        //查询到的总页数
        resultMap.put("totalPage",items.getTotalPages());
        //查询到的总条数
        resultMap.put("total",items.getTotalElements());

        return resultMap;
    }
原文地址:https://www.cnblogs.com/gxh494/p/11930772.html