solr的應用(四)商品搜索的過濾查詢以及分頁顯示

前端請求查詢的參數

{
  "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());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章