高亮显示
将用户输入的关键字在标题中以红色的字体显示出来,就是搜索中常用的高亮显示.
后端代码:
private Map searchList(Map searchMap){//创过来的条件,用于查询。
Map map=new HashMap();//创建一个Map对象用来返回高亮数据
HighlightQuery query=new SimpleHighlightQuery();
//设置高亮的域,可以加多个域
HighlightOptions highlightOptions=new HighlightOptions().addField("item_title");
highlightOptions.setSimplePrefix("<em style='color:red'>");//高亮前缀
highlightOptions.setSimplePostfix("</em>");//高亮后缀
query.setHighlightOptions(highlightOptions);//设置高亮选项
//按照关键字查询
Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);//添加查询条件
HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);//查询
for(HighlightEntry<TbItem> h: page.getHighlighted()){//循环高亮入口集合
TbItem item = h.getEntity();//获取原实体类,存储的不带高亮
if(h.getHighlights().size()>0 && h.getHighlights().get(0).getSnipplets().size()>0){
item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));//设置高亮的结果
}
}
map.put("rows",page.getContent());
return map;
}
注:
1.h.getHighlights()是集合的原因:可能有多个域
new HighlightOptions().addField("item_title").addField("item_price")...;
2.h.getHighlights().get(0).getSnipplets()是集合的原因:可能有多个值,比如搜索三星手机,三星和手机代表两个词语从title中搜索。
3.后端将html标签传递给前端页面,但是前端页面不会解析,而是当做字符串进行显示。因为angularJS的安全机制为了避免html注入攻击采取的策略,解决:
在前端的base.js中加入过滤器和$sce服务
app.filter('trustHtml',['$sce',function($sce){//写一个过滤器名字是trustHtml,引入服务
return function(data){
return $sce.trustAsHtml(data);
}
}]);
页面中:ng-bind-html用于显示html的内容
<div class="attr" ng-bind-html="item.title | trustHtml"></div>//item.title是过滤器中的data
分组查询
private List searchCategoryList(Map searchMap){
List<String> list=new ArrayList();
Query query=new SimpleQuery();
//按照关键字查询
Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
//设置分组选项
GroupOptions groupOptions=new GroupOptions().addGroupByField("item_category");
query.setGroupOptions(groupOptions);
//得到分组页
GroupPage<TbItem> page = solrTemplate.queryForGroupPage(query, TbItem.class);
//根据列得到分组结果集
GroupResult<TbItem> groupResult = page.getGroupResult("item_category");
//得到分组结果入口页
Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
//得到分组入口集合
List<GroupEntry<TbItem>> content = groupEntries.getContent();
for(GroupEntry<TbItem> entry:content){
list.add(entry.getGroupValue());//将分组结果的名称封装到返回值中
}
return list;
}
过滤查询
...
Criteria filterCriteria=new Criteria("item_category").is(searchMap.get("category"));
FilterQuery filterQuery=new SimpleFilterQuery(filterCriteria);
query.addFilterQuery(filterQuery);
...