1.构造高亮查询对象HighlightQuery,它Query接口的子接口
HighlightQuery query = new SimpleHighlightQuery();
//查询solr中自定义的复制域,匹配传过来的关键字
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
2.构件高亮选项对象
HighlightOptions highlightOptions = new HighlightOptions();
//设置高亮显示的域,可以设置多个,在后面接.addField("")即可
highlightOptions.addField("item_title");
highlightOptions.setSimplePrefix("<em style='color:red'>"); //设置高亮显示前缀
highlightOptions.setSimplePostfix("</em>"); //设置高亮显示后缀
query.setHighlightOptions(highlightOptions); //为查询对象设置高亮选项
3.进行高亮查询,并且替换高亮数据
//进行高亮查询,得到高亮页对象
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
//从page中获取高亮数据的入口的集合,也就是能获取高亮部分的数据和普通的数据
List<HighlightEntry<TbItem>> entryList = page.getHighlighted();
//遍历entryList,里面有每一条数据的普通数据和高亮数据
for (HighlightEntry<TbItem> entry : entryList) {
//获取这个entry的高亮列表list(list的大小取决于前面设置的高亮域的数量)
List<Highlight> highlights = entry.getHighlights();
//遍历highlights,得到每一个Highlight对象
for (Highlight h : highlights) {
List<String> sns = h.getSnipplets(); //得到高亮域的内容,返回一个list,是因为可能一个域中会存储多个值,比如说复制域
System.out.println(sns);
}
//获取该条记录的普通数据
TbItem item = entry.getEntity();
//将高亮数据设置到普通数据对应的域里面(我这里值设置了一个域,且域里面的值存储一个值,所以默认取list中第一个元素)
if(highlights.size() >0 && highlights.get(0).getSnipplets() != null && highlights.get(0).getSnipplets().size() > 0){
String title = highlights.get(0).getSnipplets().get(0);
item.setTitle(title);
}
}
//返回数据
map.put("rows", page.getContent());
//返回
return map;