SpringDataSolr( 二 )

SpringDataSolr

SpringDataSolr( 二 )_第1张图片

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("");//高亮前缀 
    highlightOptions.setSimplePostfix("");//高亮后缀
    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;
}

SpringDataSolr( 二 )_第2张图片

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;
}

SpringDataSolr( 二 )_第3张图片

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("");
        options.setSimplePostfix("");
        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}}表达式赋值后浏览器才会解析

你可能感兴趣的:(项目技术)