Springboot+AngularJS+Spring-data-Solr:搜索内容匹配高亮显示

简介: Springboot+AngularJS+Spring-data-Solr:搜索内容匹配高亮显示

Springboot+AngularJS+Spring-data-Solr:搜索内容匹配高亮显示


Java后台部分:


package com.phubing.search.service.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.HighlightOptions;
import org.springframework.data.solr.core.query.HighlightQuery;
import org.springframework.data.solr.core.query.Query;
import org.springframework.data.solr.core.query.SimpleHighlightQuery;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.HighlightEntry;
import org.springframework.data.solr.core.query.result.HighlightEntry.Highlight;
import org.springframework.data.solr.core.query.result.HighlightPage;
import org.springframework.data.solr.core.query.result.ScoredPage;
import com.alibaba.dubbo.config.annotation.Service;
import com.phubing.pojo.TbItem;
import com.phubing.search.service.ItemSearchService;
/**
 * 如果搜索时间过长,会造成搜索超时
 * dubbo搜索时间默认为1秒钟
 * 并发高或者服务器性能不够
 * 可以加上@Service(timeout=3000)注解,设置dubbo超时时间
 * 如果服务方和消费方同时设置了超时时间,dubbo会以消费方的设置为准
 * 
 * @author phubing
 *
 */
@Service(timeout=3000)
public class ItemSearchServiceImpl implements ItemSearchService{
  @Autowired
  private SolrTemplate solrTemplate;
  @Override
  public Map<String, Object> search(Map searchMap) {
    Map<String, Object> map = new HashMap<String, Object>();
    /*Query query = new SimpleQuery("*:*");
    //is表示匹配
    *//**
     * {
     * "keywords":"关键字"
     * }
     *//*
    Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
    query.addCriteria(criteria );
    ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
    //将当前返回结果返回给rows
    *//**
     * 返回的格式为
     * {rows:[]}
     * 
     *//*
    map.put("rows", page.getContent());*/
    HighlightQuery query = new SimpleHighlightQuery();
    HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");
    //前缀
    highlightOptions.setSimplePrefix("<strong style=\'color:red;\'>");
    //后缀
    highlightOptions.setSimplePostfix("</strong>");
    //为查询对象设置高亮选项
    /**
     * <strong style="color:red;">搜索关键字/词</strong>
     */
    query.setHighlightOptions(highlightOptions);
    //关键字查询
    Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
    query.addCriteria(criteria );
    //返回一个高亮页对象
    HighlightPage<TbItem> page = solrTemplate.queryForHighlightPage(query, TbItem.class);
    /**
     * 1、此时可以获取到一个不经过高亮处理的内容 page.getContent()
     * 2、需要从高亮入口集合获取
     * 3、entryList集合的每个对象,就是每条记录的内容
     * 4、HighlightEntry<TbItem>是高亮入口对象,存在一个获取所有高亮的方法
     * 5、高亮列表中为何还有一个高亮列表?
     *  5.1 HighlightOptions().addField设置高亮列,并且可以建立多个高亮列
     *  5.2 建立了多个高亮列就会返回多个高亮列
     * 6、为何Highlight highlightEntry也是一个高亮列,而不是直接获取一个高亮值?
     *  6.1 每一个域有可能存储多值,在schema.xml中配置了N个单独的field,所以每一个高亮列都有其单独的域
     * 7、如何让页面产生高亮结果?
     *  7.1 从高亮列表中获取高亮列,highlightsList.get(0).getSnipplets().get(0)
     *  7.2 将高亮页赋予结果集page.getContent():item.setTitle(highlightsList.get(0).getSnipplets().get(0));
     * 
     */
    //需要从返回高亮对象中获取高亮结果再返回,即在高亮入口集合中遍历
    List<HighlightEntry<TbItem>> entryList = page.getHighlighted();
    for (HighlightEntry<TbItem> entry : entryList) {
      //得到一个高亮列表
      List<Highlight> highlightsList = entry.getHighlights();
      //是否还需要遍历取决于高亮列的个数
      /*for (Highlight highlightEntry : highlightsList) {
        List<String> snippletsList = highlightEntry.getSnipplets();
      }*/
      if(highlightsList.size() > 0 && highlightsList.get(0).getSnipplets().size() > 0) {
        //与page.getContent()是同一个
        TbItem item = entry.getEntity();
        //确定只有一列的情况下
        item.setTitle(highlightsList.get(0).getSnipplets().get(0));
      }
    }
    map.put("rows", page.getContent());
    return map;
  }
}

AngularJS中controller层:


/*
Angularjs为了防止(html、js)攻击,会将后端返回的html代码原样输出,此时需要采用$sce,即Angularjs信任策略,使用后就会解析后再输出
trustHtml、trustJs
将过滤服务封装成通用过滤器
*/
//封装通用过滤器
app.filter('trustHtml',['$sce', function($sce){
  //传入的参数就是需要过滤的内容
  return function(data){
    return $sce.trustAsHtml(data);
  }
}]);


页面调用:


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


目录
相关文章
|
4天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
32 8
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
151 5
|
3月前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
84 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
3月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
120 2
|
3月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
345 1
|
3月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
44 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
3月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
51 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
3月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
246 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
3月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
268 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
3月前
|
SQL Java 数据库
Springboot+spring-boot-starter-data-jdbc实现数据库的操作
本文介绍了如何使用Spring Boot的spring-boot-starter-data-jdbc依赖来操作数据库,包括添加依赖、配置数据库信息和编写基于JdbcTemplate的数据访问代码。
327 2