学习品优购总结[十](搜索解决方案-Solr二)

高亮显示

将用户输入的关键字在标题中以红色的字体显示出来,就是搜索中常用的高亮显示.
后端代码:

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);
	...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值