高亮查询:
public Map<String, Object> search(Map searchMap) {
Map<String,Object> map = new HashMap<String, Object>();
/*简单查询
Query query = new SimpleQuery();
//相当于select * from 4种复制域 where 查询条件 = ""
//这句就是让前端传来的keywords来对后台的item_keywords来进行查询
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
//分页查询,默认0开始,每页10条
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
//这是我们要查询的结果
List<TbItem> content = page.getContent();
//塞到map
map.put("rows",content);*/
//1、创建一个支持高亮查询器对象
SimpleHighlightQuery query = new SimpleHighlightQuery();
//2、创建高亮选项对象
HighlightOptions highlightOptions = new HighlightOptions();
//3、设定需要高亮处理字段
highlightOptions.addField("item_title");
//4、设置高亮前缀
highlightOptions.setSimplePrefix("<em style='color:red'>");
//5、设置高亮后缀
highlightOptions.setSimplePostfix("</em>");
//6、关联高亮选项到高亮查询器对象
query.setHighlightOptions(highlightOptions);
//7、设定查询条件 根据关键字查询
//创建查询条件对象
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
//关联查询条件到查询器对象
query.addCriteria(criteria);
//8、发出带高亮数据查询请求
HighlightPage<TbItem> highlightPage = solrTemplate.queryForHighlightPage(query, TbItem.class);
//9、获取查询结果记录集合
List<TbItem> list = highlightPage.getContent();
//10、循环集合对象
for (TbItem item : list) {
//获取到针对对象TbItem高亮集合
List<HighlightEntry.Highlight> highlights = highlightPage.getHighlights(item);
if(highlights!=null&&highlights.size()>0) {
//获取第一个字段高亮对象
List<String> highlightSnipplets = highlights.get(0).getSnipplets();
System.out.println("高亮:" + highlightSnipplets.get(0));
//使用高亮结果替换商品标题
item.setTitle(highlightSnipplets.get(0));
}
}
map.put("rows",highlightPage.getContent());
return map;
}
我们测试后发现高亮显示的html代码原样输出,这是angularJS为了防止html攻击采取的安全机制。我们如何在页面上显示html的结果呢?我们会用到$sce服务的trustAsHtml方法来实现转换。
app.filter('trustHtml',['$sce',function($sce){
return function(data){
return $sce.trustAsHtml(data);
}
}]);
(2)使用过滤器
ng-bind-html指令用于显示html内容
竖线 |用于调用过滤器
<div class="attr" ng-bind-html="item.title | trustHtml"></div>