SpringDataSolr
1. 关键字查询及高亮显示
/**
* 根据关键字搜索列表
* @param keywords 关键字
* @return
*/
private Map searchList(Map searchMap){
Map map=new HashMap();
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> highlightPage = solrTemplate.queryForHighlightPage(query, TbItem.class);
//拿到记录集合
List<HighlightEntry<TbItem>> entryList = highlightPage.getHighlighted();
for (HighlightEntry<TbItem> entry : entryList) {
//地址和highlightPage.getContent()中的正常entity地址相同
//所以下面设置title时其实是更新结果集的数据
TbItem item = entry.getEntity();
//拿到某一条记录的高亮字段集合
List<HighlightEntry.Highlight> highlights = entry.getHighlights();
for (HighlightEntry.Highlight highlight : highlights) {
//拿到字段数据 可能为多值
String title = highlight.getSnipplets().get(0);
item.setTitle(title);
}
}
map.put("rows",highlightPage.getContent());
return map;
}
2.分组查询
/**
* 查询分类列表
* @param searchMap
* @return
*/
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;
}
3.过滤查询
private Map searchList(Map searchMap){
Map map=new HashMap();
HighlightQuery query = new SimpleHighlightQuery();
Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
HighlightOptions options = new HighlightOptions();
options.setSimplePrefix("<em style='color:red'>");
options.setSimplePostfix("</em>");
options.addField("item_title");
query.addCriteria(criteria);
query.setHighlightOptions(options);
//过滤条件 在上面查询的结果集中再次筛选
if(!searchMap.get("category").equals("")){
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("item_category").is(searchMap.get("category"));
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
if(!searchMap.get("brand").equals("")){
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
if(searchMap.get("spec")!=null){
Map<String,String> spec = (Map) searchMap.get("spec");
for (String key : spec.keySet()) {
FilterQuery filterQuery = new SimpleFilterQuery();
Criteria filterCriteria = new Criteria("item_spec_" + key).is(spec.get(key));
filterQuery.addCriteria(filterCriteria);
query.addFilterQuery(filterQuery);
}
}
HighlightPage<TbItem> highlightPage = solrTemplate.queryForHighlightPage(query, TbItem.class);
//拿到记录集合
List<HighlightEntry<TbItem>> entryList = highlightPage.getHighlighted();
for (HighlightEntry<TbItem> entry : entryList) {
TbItem item = entry.getEntity();
//拿到记录的高亮字段集合
List<HighlightEntry.Highlight> highlights = entry.getHighlights();
for (HighlightEntry.Highlight highlight : highlights) {
//拿到字段数据 可能为多值
String title = highlight.getSnipplets().get(0);
item.setTitle(title);
}
}
map.put("rows",highlightPage.getContent());
return map;
}
AngularJS
1. 高亮不显示解决
测试后发现高亮显示的html代码原样输出,这是angularJS为了防止html攻击采取的安全机制。我们如何在页面上显示html的结果呢?我们会用到$sce服务的trustAsHtml方法来实现转换。
因为这个功能具有一定通用性,我们可以通过angularJS的过滤器来简化开发,这样只写一次,调用的时候就非常方便了
(1)修改base.js
/*$sce服务写成过滤器*/
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>
2.前端controller
app.controller('searchController',function ($scope,searchService) {
$scope.searchMap={'keywords':'','category':'','brand':'','spec':{}};
$scope.search=function () {
searchService.search($scope.searchMap).success(
function (response) {
$scope.resultMap=response;
}
)
}
//搜索面板 添加条件
$scope.addSearchItem=function (key,value) {
if(key=='category' || key=='brand'){
$scope.searchMap[key]=value;
}else{
$scope.searchMap.spec[key]=value;
}
$scope.search();
}
//搜索面板 移除条件
$scope.removeSearchItem=function (key) {
if(key=='category' || key=='brand'){
$scope.searchMap[key]='';
}else{
delete $scope.searchMap.spec[key];
}
$scope.search();
}
})
3.指令及函数
1.ng-repeat
<li class="tag" ng-repeat="(key,value) in searchMap.spec">{{key}}:{{value}}</li>
2.ng-src
将src="{{entity.pic}}"的src改为ng-src
解决angularjs还没加载完全时,浏览器认为{{entity.pic}}为图片地址去get请求而出现的404问题
改为ng-src后 在angularjs将{{entity.pic}}表达式赋值后浏览器才会解析