Solr的核心操作案例

@Service
public class SearchServiceImpl implements SearchService {

    @Autowired
    private SolrTemplate solrTemplate;

    @Autowired
    private TbItemMapper itemMapper;

    @Override
    public Map search(Map searchMap) {

        String keywords = (String) searchMap.get("keywords");
        System.out.println("查询关键字是:"+keywords);

        //通过solrTemplate进行索引库的查询

        //直接创建高亮查询
        SimpleHighlightQuery query = new SimpleHighlightQuery(); //不需要指定*:*

        //封装搜索条件
        Criteria criteria = new Criteria("item_keywords");  //要查询的域
        criteria = criteria.contains(keywords);  //要查询的条件
        query.addCriteria(criteria);

        //设置高亮效果选项
        HighlightOptions options = new HighlightOptions();
        options.addField("item_title");  //设置哪个域加高亮效果
        options.setSimplePrefix("<em style='color:red'>"); // 高亮头部
        options.setSimplePostfix("</em>"); // 高亮尾部
        query.setHighlightOptions(options);

        //增加过滤查询条件--商品分类
        String categoryStr = (String) searchMap.get("category");
        if(categoryStr!=null && categoryStr.length() > 0){

            FilterQuery filterQuery = new SimpleFilterQuery();
            Criteria filterCriteria = new Criteria("item_category"); //设置Criteria
            filterCriteria = filterCriteria.contains(categoryStr); //进行查询比较
            filterQuery.addCriteria(filterCriteria);

            //增加过滤查询条件
            query.addFilterQuery(filterQuery);
        }

        //增加过滤查询条件--商品品牌
        String brandStr = (String) searchMap.get("brand");
        if(brandStr!= null && brandStr.length() > 0){

            SimpleFilterQuery filterQuery = new SimpleFilterQuery();
            Criteria fileterCriteria = new Criteria("item_brand");
            fileterCriteria = fileterCriteria.contains(brandStr);  //进行品牌搜索条件封装
            filterQuery.addCriteria(fileterCriteria);

            query.addFilterQuery(filterQuery);
        }

        //增加过滤查询条件--规格
        Map<String,String> specMap = (Map) searchMap.get("spec");
        if(specMap!=null){

            for (String key : specMap.keySet()) {
                SimpleFilterQuery filterQuery = new SimpleFilterQuery();
                Criteria filterCriteria = new Criteria("item_spec_"+key);
                filterCriteria = filterCriteria.contains(specMap.get(key));  //设置搜索的规格内容
                filterQuery.addCriteria(filterCriteria);
                query.addFilterQuery(filterQuery);
            }
        }

        //增加过滤查询条件--价格
        String priceStr = (String) searchMap.get("price");
        if(priceStr != null && priceStr.length() > 0){
            String[] prices = priceStr.split("-");

            //获取起始值作为价格初始条件
            SimpleFilterQuery filterQuery1 = new SimpleFilterQuery();
            Criteria filterCriteria1 = new Criteria("item_price");
            filterCriteria1 = filterCriteria1.greaterThanEqual(prices[0]);  //price>= 价格条件查询
            filterQuery1.addCriteria(filterCriteria1);
            query.addFilterQuery(filterQuery1);

            if(!"*".equals(prices[1])){  //当结束价格不定*才会有结束价格范围,否则3000-*,就是起始是3000,没有结束价格
                //获取结束值作为价格结束条件
                SimpleFilterQuery filterQuery2 = new SimpleFilterQuery();
                Criteria filterCriteria2 = new Criteria("item_price");
                filterCriteria2 = filterCriteria2.lessThanEqual(prices[1]);  //price<= 价格条件查询
                filterQuery2.addCriteria(filterCriteria2);
                query.addFilterQuery(filterQuery2);
            }
        }

        //设置价格升降序查询
        String sortStr = (String) searchMap.get("sort");

        Sort sort;
        if("ASC".equals(sortStr)){
            //设置价格升序查询
            sort = new Sort(Sort.Direction.ASC, "item_price");        //参数一是设置升降序  参数二设置升降序的域
        }else{
            //设置价格降序查询
            sort = new Sort(Sort.Direction.DESC, "item_price");
        }
        query.addSort(sort);

        Integer pageNo = (Integer) searchMap.get("pageNo");
        Integer pageSize = (Integer) searchMap.get("pageSize");

        //设置分页相关参数
        query.setRows(pageSize);  //pageSize
        query.setOffset((pageNo-1)*pageSize);//offset = (pageNo - 1)*pageSize,起始的索引数

        //直接采用solr的高亮查询
        HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);

        List<TbItem> content = page.getContent();

        for (TbItem item : content) {
            List<HighlightEntry.Highlight> highlights = page.getHighlights(item);

            if(highlights.size() > 0){ //防止出现的结果item_title中没有高亮关键字
                List<String> snipplets = highlights.get(0).getSnipplets();
                if(snipplets.size() > 0){
                    item.setTitle(snipplets.get(0));  //设置高亮后的效果
                }
            }
        }

        //封装前端分页插件的需要的属性,rows,total(模仿PageResult)
        Map returnMap = new HashMap<>();
        returnMap.put("rows", content);
        returnMap.put("total",page.getTotalElements());  //TotalElements总记录数
                                                        //page.getTotalPages()总页数
        return returnMap;
    }

    @Override
    public void importData(Long[] ids) {
        //根据导入的goods的id,查询出本次需要导入的item对象,保存到solr索引库
        TbItemExample example = new TbItemExample();
        example.createCriteria().andGoodsIdIn(Arrays.asList(ids));
        List<TbItem> items = itemMapper.selectByExample(example);

        for (TbItem item : items) {
            System.out.println("导入了:"+item.getTitle());
        }
        solrTemplate.saveBeans(items);
        solrTemplate.commit(); //提交一下
    }

    @Override
    public void removeData(Long[] ids) {
        TbItemExample example = new TbItemExample();
        example.createCriteria().andGoodsIdIn(Arrays.asList(ids));
        List<TbItem> items = itemMapper.selectByExample(example);

        for (TbItem item : items) {
            solrTemplate.deleteById(item.getId() + "");

            System.out.println("删除了:"+item.getTitle());

        }

        solrTemplate.commit();
    }
}
上一篇:通过Hibernate Projections on Entity with ManyToOne关系,在SQL查询上使用更少的列


下一篇:c# – 如何限制NHibernate的GetByCriteria撤回的结果集?