• 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;
        }
  • 相关阅读:
    DeepEarth开发文章汇总
    让人期待的Visual Studio 2010
    Silverlight & Blend动画设计系列文章
    杜拉拉“植入式营销”魔法(为写植入式广告fxgj介绍)
    C++ String Split
    一个类似Java String[] split(String regex)的VC++函数
    MSChart控件的属性与属性对话框
    植入式广告介绍 撰写 素材
    植入式营销 为何不能植入顾客脑海
    PQA2000 地震应急救生器
  • 原文地址:https://www.cnblogs.com/gxh494/p/11930772.html
Copyright © 2020-2023  润新知