solr的高亮搜索
步骤:
1.获取搜索的关键字
String keywords = (String) searchMap.get("keywords");
2.根据关键字进行查询
Criteria criteria = new Criteria("item_keywords");
criteria.contains(keywords);
query.addCriteria(criteria);
3.高亮搜索设置
HighlightOptions options = new HighlightOptions(); // 声明高亮选项
options.addField("item_title"); // 设置需要高亮的域
options.setSimplePrefix("<em style='color:red'>"); // 高亮头部
options.setSimplePostfix("</em>"); // 高亮尾部
SimpleHighlightQuery query = new SimpleHighlightQuery();
query.setHighlightOptions(options);
4.增加过滤条件
String category = (String) searchMap.get("category"); //获取过滤条件的关键字
if (category != null && category.trim().length() > 0) {
Criteria qcriteria = new Criteria("item_category"); // 过滤item_category这个域
qcriteria.contains(category); // 域里包含过滤关键字
SimpleFilterQuery filterQuery = new SimpleFilterQuery(qcriteria);
query.addFilterQuery(filterQuery);
System.out.println("添加了分类过滤"+category);
}
5.升降序查询
String sortStr = (String) searchMap.get("sort"); // 获取升降排序 的关键字
if ("ASC".equals(sortStr)) {
Sort orders = new Sort(Sort.Direction.ASC, "item_price"); // 根据item_price升序排序
query.addSort(orders);
} else {
Sort orders = new Sort(Sort.Direction.DESC, "item_price"); // 根据item_price降序排序
query.addSort(orders);
}
6. 分页
Integer pageNo = (Integer) searchMap.get("pageNo"); //从前端获取传来的页码数
Integer PageSize = (Integer) searchMap.get("pageSize"); // 获取前端传来的每页几条数据
query.setOffset((pageNo-1)*PageSize); // 从第几条记录开始查询
query.setRows(PageSize); // 每页查询几条
7. 通过高亮进行查询
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class); // 一定要在封装查询关键字和设置过滤关键字后查询。
List <TbItem> returnItems = page.getContent(); // 查询的结果封装为一个list集合
8. 获取封装的高亮的数据,设置item_title高亮
for (TbItem item : returnItems) {
//一定要判断当前的集合不为空,否则会崩
if(page.getHighlights(item)!=null && page.getHighlights(item).size() > 0){
List<HighlightEntry.Highlight> highlights = page.getHighlights(item);
HighlightEntry.Highlight highlight = highlights.get(0);
List<String> snipplets = highlight.getSnipplets();
if(snipplets!=null && snipplets.size() > 0){
item.setTitle(snipplets.get(0)); //将前后修饰的高亮内容再次封装回item的title中
}
}
}
9.返回数据到前端
Map returnMap = new HashMap<>();
returnMap.put("content", returnItems);
//需要封装总页数
returnMap.put("total", page.getTotalElements());//设置返回值中的总记录数