• 使用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>
  • 相关阅读:
    vscode安装
    Linux下 Python绘图与可视化 及matplotlib与_tkinter安装
    C语言-结构体定义的几种方式
    leetcode- 88. 合并两个有序数组
    leetcode-16. 最接近的三数之和
    Leetcode-15. 三数之和
    Leetcode-561. 数组拆分 I
    Windows_pycharm下安装numpy
    python实现两个两个的翻转字符串
    linux复制文件夹、重命名文件夹、删除文件夹
  • 原文地址:https://www.cnblogs.com/limn/p/9754353.html
Copyright © 2020-2023  润新知