solr的应用(四)商品搜索的过滤查询以及分页显示

本文详细介绍了如何在Solr中实现高亮显示和过滤查询功能,包括关键词、分类、品牌、规格、价格等多维度过滤,以及分页配置。通过具体代码示例,展示了如何设置高亮选项和过滤条件,实现高效精确的搜索结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端请求查询的参数

{
  "keywords": "手机",
  "category": "",
  "brand": "三星",
  "spec": {
    "网络": "移动3G",
    "机身内存": "16G"
  },
  "price": "",
  "pageNo": 1,
  "pageSize": 20
}

后端使用 Map进行接收
fq 值是一个查询,用于过滤查询结果,在负责查询时,可以很好的提高查询效率
判断字符串是否为空用空串和equals方法判断,判断对象是否为空使用null判断
将过滤查询的代码加在高亮显示查询的代码中间

//分类过滤查询
if (!"".equals(searchMap.get("category"))){
    Criteria categoryCriteria = new Criteria("item_category").is(searchMap.get("category"));
    FilterQuery categoryQuery = new SimpleFacetQuery(categoryCriteria);
    query.addFilterQuery(categoryQuery);
}
//品牌过滤查询
if (!"".equals(searchMap.get("brand"))){
    Criteria brandCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
    FilterQuery brandQuery = new SimpleFilterQuery(brandCriteria);
    query.addFilterQuery(brandQuery);
}
//规格过滤查询
// {"网络":"移动4G","机身内存":"32G"}
if (searchMap.get("spec")!=null){
    //先把spec转换成Map格式,强制转换
    Map<String,String> specMap = (Map<String, String>) searchMap.get("spec");
    for (String key : specMap.keySet()) {
        Criteria specCriteria = new Criteria("item_spec_"+Pinyin.toPinyin(key, "").toLowerCase()).is(specMap.get(key));
        FilterQuery specQuery = new SimpleFilterQuery(specCriteria);
        query.addFilterQuery(specQuery);
    }
}
//价格过滤查询
//价格形式:500-1000   1000-1500   1500-*
if (!"".equals(searchMap.get("price"))){
    //截取价格
    String priceStr = (String) searchMap.get("price");
    String[] price = priceStr.split("-");//这里是字符串类型的价格
    Criteria minCriteria = new Criteria("item_price").greaterThanEqual(price[0]);
    FilterQuery minFq = new SimpleFilterQuery(minCriteria);
    query.addFilterQuery(minFq);
    //小于最高价格要考虑是否有最高价格
    if (price[1].equals("*")){

    }else{
        Criteria maxCriteria = new Criteria("item_price").lessThanEqual(price[1]);
        FilterQuery maxFq = new SimpleFilterQuery(maxCriteria);
        query.addFilterQuery(maxFq);
    }
}

solr的分页配置

//分页
Integer pageNo = (Integer) searchMap.get("pageNo");
Integer pageSize = (Integer) searchMap.get("pageSize");
// 页面容量
query.setRows(pageSize);
// 起始位置
query.setOffset((pageNo-1)*pageSize);
//总页数
map.put("totalPages",pages.getTotalPages());
//总记录
map.put("total",pages.getTotalElements());

完整代码

private void highlight(Map searchMap,Map map){
    HighlightQuery query = new SimpleHighlightQuery();
    HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");//设置高亮的域
    //设置前后缀
    highlightOptions.setSimplePrefix("<span style='color:red'>");
    highlightOptions.setSimplePostfix("</span>");
    //设置高亮选项
    query.setHighlightOptions(highlightOptions);
    // is:基于分词后的结果 和 传入的参数匹配
    Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
    // 添加查询条件
    query.addCriteria(criteria);

    //过滤查询

    //分类过滤查询
    if (!"".equals(searchMap.get("category"))){
        Criteria categoryCriteria = new Criteria("item_category").is(searchMap.get("category"));
        FilterQuery categoryQuery = new SimpleFacetQuery(categoryCriteria);
        query.addFilterQuery(categoryQuery);
    }
    //品牌过滤查询
    if (!"".equals(searchMap.get("brand"))){
        Criteria brandCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
        FilterQuery brandQuery = new SimpleFilterQuery(brandCriteria);
        query.addFilterQuery(brandQuery);
    }
    //规格过滤查询
    // {"网络":"移动4G","机身内存":"32G"}
    if (searchMap.get("spec")!=null){
        //先把spec转换成Map格式,强制转换
        Map<String,String> specMap = (Map<String, String>) searchMap.get("spec");
        for (String key : specMap.keySet()) {
            Criteria specCriteria = new Criteria("item_spec_"+Pinyin.toPinyin(key, "").toLowerCase()).is(specMap.get(key));
            FilterQuery specQuery = new SimpleFilterQuery(specCriteria);
            query.addFilterQuery(specQuery);
        }
    }
    //价格过滤查询
    //价格形式:500-1000   1000-1500   1500-*
    if (!"".equals(searchMap.get("price"))){
        //截取价格
        String priceStr = (String) searchMap.get("price");
        String[] price = priceStr.split("-");//这里是字符串类型的价格
        Criteria minCriteria = new Criteria("item_price").greaterThanEqual(price[0]);
        FilterQuery minFq = new SimpleFilterQuery(minCriteria);
        query.addFilterQuery(minFq);
        //小于最高价格要考虑是否有最高价格
        if (price[1].equals("*")){

        }else{
            Criteria maxCriteria = new Criteria("item_price").lessThanEqual(price[1]);
            FilterQuery maxFq = new SimpleFilterQuery(maxCriteria);
            query.addFilterQuery(maxFq);
        }
    }

    //分页
    Integer pageNo = (Integer) searchMap.get("pageNo");
    Integer pageSize = (Integer) searchMap.get("pageSize");
    // 页面容量
    query.setRows(pageSize);
    // 起始位置
    query.setOffset((pageNo-1)*pageSize);

    //查询带高亮结果的数据
    HighlightPage<TbItem> pages = solrTemplate.queryForHighlightPage(query, TbItem.class);
    //将查询出来带高亮结果的数据放到title中
    for (HighlightEntry<TbItem> highlightEntry : pages.getHighlighted()) {
        TbItem item = highlightEntry.getEntity();
        //加入判断,避免为null的时候数组越界
        if (highlightEntry.getHighlights().size()>0 && highlightEntry.getHighlights().get(0).getSnipplets().size()>0){
            item.setTitle(highlightEntry.getHighlights().get(0).getSnipplets().get(0));
        }
    }
    map.put("rows",pages.getContent());//getContent()获取数据列表
    //总页数
    map.put("totalPages",pages.getTotalPages());
    //总记录
    map.put("total",pages.getTotalElements());
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值