使用spring data solr 实现搜索关键字高亮显示

后端实现:

@Service
public class ItemSearchServiceImpl implements ItemSearchService {
    @Autowired
    private SolrTemplate solrTemplate;

    @Override
    public Map<String, Object> search(Map searchMap) {
        Map<String,Object> map=new HashMap<>();

        //1.查询列表
        Map searchListMap = searchList(searchMap);

        map.putAll(searchListMap);
        return map;
    }


    /**
     * 根据关键字搜索列表
     * @param searchMap
     * @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<Item> page = solrTemplate.queryForHighlightPage(query, Item.class);

        for ( HighlightEntry<Item> h : page.getHighlighted()) {//循环高亮入口集合
            Item item = h.getEntity();//获得原实体类
            //获取高亮列表(高亮域的个数) h.getHighlights();
            //获取每个域有可能存储多值  h.getSnipplets()
            //获取要高亮的内容 h.getSnipplets.get(0);
            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;
    }
}

 

前端显示:

angularJS为了防止html攻击采取的安全机制,所以不能直接显示html的结果。

我们就要用到$sce服务trustAsHtml方法来实现转换。

/*$sce服务写成过滤器*/
app.filter('trustHtml',['$sce',function ($sce) {
return function (data) {//传入参数是被过滤的内容
return $sce.trustAsHtml(data);//返回的是过滤后的内容(信任html的转换)
}
}]);

 

使用过滤器

ng-bind-html指令用于显示html内容

竖线 | 用于调用过滤器

<div class="attr" ng-bind-html="item.title | trustHtml">
     <em>{{item.title}}</em>
</div>

 

posted @ 2018-10-08 14:56  Kmily_Lee  阅读(1539)  评论(0编辑  收藏  举报