前端请求查询的参数
{
"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());
}