根据关键字查询,过滤、排序、高亮显示
public Map<String, Object> highlightSearch(Map searchMap) {
//获取查询关键字
String keywords =(String) searchMap.get("keywords");
if(keywords != null){
keywords = keywords.replaceAll(" ","");
}
//获取当前页
Integer pageNo = Integer.parseInt(String.valueOf(searchMap.get("pageNo")));
//获取每页多少条数据
Integer pageSize = Integer.parseInt(String.valueOf(searchMap.get("pageSize")));
//过滤查询
//获取页面点击分类的过滤条件
String category = (String)searchMap.get("category");
//获取页面点击品牌的过滤条件
String brand = (String)searchMap.get("brand");
//获取点击规格的过滤条件
String spec = String.valueOf(searchMap.get("spec"));
//获取页面点解价格区间的过滤条件
String price = (String)searchMap.get("price");
//获取页面排序的域(按什么字段排序)
String sortField = String.valueOf(searchMap.get("sortField"));
//获取页面排序的规则(升序、降序)
String sortType = String.valueOf(searchMap.get("sort"));
//封装查询的对象
HighlightQuery query = new SimpleHighlightQuery();
//查询的条件对象
Criteria criteria = new Criteria("item_keywords").is(keywords);
//将查询条件对象,放入查询对象中
query.addCriteria(criteria);
//计算当前页第一条数据的索引是几。
if(pageNo == null || pageNo <= 0){
pageNo = 1;
}
Integer start = (pageNo - 1) * pageSize;
//设置查询对象从第几条开始查询
query.setOffset(start);
//设置每页多少条数据
query.setRows(pageSize);
//创建高亮显示对象
HighlightOptions highlightOptions = new HighlightOptions();
//设置哪个域需要高亮显示
highlightOptions.addField("item_title");
//设置高亮的前缀
highlightOptions.setSimplePrefix("<em style = 'color:red'>");
//设置高亮的后缀
highlightOptions.setSimplePostfix("</em>");
//将高亮显示对象,加入到查询对象中
query.setHighlightOptions(highlightOptions);
//根据分类过滤查询
if(category != null && !"".equals(category)){
//创建过滤对象
FilterQuery simpleFilterQuery = new SimpleFilterQuery();
//查询的条件对象
Criteria filterCriteria = new Criteria("item_category").is(category);
//将查询条件对象,放入过滤对象中
simpleFilterQuery.addCriteria(filterCriteria);
//过滤,放入查询对象中
query.addFilterQuery(simpleFilterQuery);
}
//根据品牌过滤查询
if(brand != null && !"".equals(brand)){
//创建过滤对象
FilterQuery simpleFilterQuery = new SimpleFilterQuery();
//创建查询条件
Criteria brandCriteria = new Criteria("item_brand").is(brand);
//将查询条件放入过滤对象
simpleFilterQuery.addCriteria(brandCriteria);
//将过滤对象放入查询对象
query.addFilterQuery(simpleFilterQuery);
}
//根据规格查询,spec中的数据格式:json格式
if(spec != null && !"".equals(spec)){
Map<String,String> specMap = JSON.parseObject(spec, Map.class);
System.out.println(specMap);
if(specMap != null && searchMap.size() > 0){
Set<Map.Entry<String, String>> entries = specMap.entrySet();
for(Map.Entry<String, String> entry : entries){
//创建过滤查询对象
FilterQuery simpleFilterQuery = new SimpleFilterQuery();
//创建查询条件
System.out.println(entry.getKey()+entry.getValue());
Criteria specCriteria = new Criteria("item_spec_"+entry.getKey()).is(entry.getValue());
//将条件对象放入过滤查询对象中
simpleFilterQuery.addCriteria(specCriteria);
//将过滤对象放入到查询对象中
query.addFilterQuery(simpleFilterQuery);
}
}
}
//根据价格查询
if(price != null && !"".equals(price)){
//切割price字符串。
//如果价格区间为0-500元,那么切割后的数组中第一个元素的值为0,第二个值的元素为500
String[] split = price.split("-");
if(split != null && split.length == 2){
//既不是第一个元素为0,也不是最后一个元素为*的其他区间,需要满足两个条件:split[0]<价格区间<split[1]。
//如果split[0]为0,代表价格区间只需要小于split[1]这一个条件即可,所以不需要进入该if语句。
if(!"0".equals(split[0])){
//创建过滤查询条件
FilterQuery simpleFilterQuery = new SimpleFilterQuery();
//创建查询条件
Criteria priceCriteria = new Criteria("item_price").greaterThanEqual(split[0]);
//将条件对象放入过滤查询对象中
simpleFilterQuery.addCriteria(priceCriteria);
//将过滤对象放入到查询对象中
query.addFilterQuery(simpleFilterQuery);
}
//如果split[1]为*,代表要查的价格区间为:split[0]以上的所有商品,所以只需要满足大于split[0]这一个条件即可。不需要进入该if语句
if(!"*".equals(split[1])){
//创建过滤查询条件
FilterQuery simpleFilterQuery = new SimpleFilterQuery();
//创建查询条件
Criteria priceCriteria = new Criteria("item_price").lessThanEqual(split[1]);
//将条件对象放入过滤查询对象中
simpleFilterQuery.addCriteria(priceCriteria);
//将过滤对象放入到查询对象中
query.addFilterQuery(simpleFilterQuery);
}
}
}
//添加排序的条件
if(sortField != null && sortType != null && !"".equals(sortField) && !"".equals(sortType)){
//升序
if("asc".equalsIgnoreCase(sortType)){
//创建一个排序对象(枚举,一组常量的值)
Sort sort = new Sort(Sort.Direction.ASC, "item_" + sortField);
//将排序对象放入查询对象中
query.addSort(sort);
}
//降序
if("desc".equalsIgnoreCase(sortType)){
//创建一个排序对象(枚举,一组常量的值)
Sort sort = new Sort(Sort.Direction.DESC, "item_" + sortField);
//将排序对象放入查询对象中
query.addSort(sort);
}
}
//查询并且返回结果
HighlightPage<Item> items = solrTemplate.queryForHighlightPage(query, Item.class);
//获取带高亮的集合
List<HighlightEntry<Item>> highlighted = items.getHighlighted();
//创建itemList,用来存放查出的Item
List<Item> itemList = new ArrayList<>();
//遍历高亮集合
for(HighlightEntry<Item> itemHighlightEntry : highlighted){
Item item = itemHighlightEntry.getEntity();
//getEntity:Item [Hash = 514230796, id=1156083, title=OPPO R3(R7007)黑色 移动4G手机, sellPoint=null, ....
List<HighlightEntry.Highlight> highlights = itemHighlightEntry.getHighlights();
//highlights=[org.springframework.data.solr.core.query.result.HighlightEntry$Highlight@5001ef52]
if(highlights != null && highlights.size() > 0){
//获取高亮的标题集合
List<String> highLightTitle = highlights.get(0).getSnipplets();
//highLightTitle=[OPPO R3(R7007)黑色 移动4G<em style = 'color:red'>手机</em>]
//判断高亮集合是否为空
if(highLightTitle != null && highLightTitle.size() > 0 ){
//获取高亮的标题
String title = highLightTitle.get(0);
//title = OPPO R3(R7007)黑色 移动4G<em style = 'color:red'>手机</em>
item.setTitle(title);
}
}
itemList.add(item);
}
Map<String, Object> resultMap = new HashMap<>();
//查询到的结果集
resultMap.put("rows",itemList);
//查询到的总页数
resultMap.put("totalPage",items.getTotalPages());
//查询到的总条数
resultMap.put("total",items.getTotalElements());
return resultMap;
}