前端請求查詢的參數
{
"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());
}