spring-boot-starter-data-elasticsearch整合elasticsearch 6.x实现高亮highlighter解决办法

注意:此文是解决springboot 2.x通过spring-boot-starter-data-elasticsearch整合elasticsearch 6.x实现高亮highlighter解决办法。

参考官方文档:
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/

1、高亮无效

1.1 方案1(@Query)

public interface ElasticRepository extends ElasticsearchRepository<FileBean, Long>{/*** @Query方法也无法实现高亮* @param content* @param pageable* @return*/@Query("{\"bool\" : {\"must\" : {\"match\" : {\"content\" : \"?0\"}}}}," +"\"highlight\": {\"fields\" :{ \"content\" : {}}}")Page<FileBean> findByContent(String content, Pageable pageable);}
@Transactional(propagation= Propagation.REQUIRED,isolation= Isolation.DEFAULT)
@Service("elasticService")
public class ElasticServiceImpl implements ElasticService {@Autowired@Qualifier("elasticRepository")private ElasticRepository elasticRepository;@Overridepublic Page<FileBean> findByContent(String content, Integer pageNum, Integer pageSize) {Pageable pageable = PageRequest.of(pageNum - 1,pageSize);return elasticRepository.findByContent(content,pageable);}
}

该方案可正常检索数据,但是不能高亮。

1.2 方案2 Iterable search(QueryBuilder query)

@Transactional(propagation= Propagation.REQUIRED,isolation= Isolation.DEFAULT)
@Service("elasticService")
public class ElasticServiceImpl implements ElasticService {/*** 此方法主要说明,不能进行复杂的高亮查询* @param key* @param pageNum* @param pageSize* @return*/@Overridepublic Page<FileBean> highlightQuery(String key,Integer pageNum,Integer pageSize) {System.out.println(key+","+pageNum+","+pageSize);//高亮显示规则HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.preTags("<span style='color:red'>");highlightBuilder.postTags("</span>");highlightBuilder.field("fileName");highlightBuilder.field("category");highlightBuilder.field("content");SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(key,"fileName","category","content")).withHighlightBuilder(highlightBuilder).withPageable(PageRequest.of(pageNum - 1,pageSize)).build();System.out.println("查询的语句:" + searchQuery.getQuery().toString());return elasticRepository.search(searchQuery);}
}

其中elasticRepository.search(searchQuery)方法是ElasticsearchRepository接口(本文中ElasticServiceImpl 的父接口)中的方法。

@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {<S extends T> S index(S entity);Iterable<T> search(QueryBuilder query);Page<T> search(QueryBuilder query, Pageable pageable);Page<T> search(SearchQuery searchQuery);Page<T> searchSimilar(T entity, String[] fields, Pageable pageable);void refresh();Class<T> getEntityClass();
}

出现异常

java.lang.NullPointerExceptionat org.springframework.data.elasticsearch.core.ElasticsearchTemplate.doSearch(ElasticsearchTemplate.java:914)at org.springframework.data.elasticsearch.core.ElasticsearchTemplate.queryForPage(ElasticsearchTemplate.java:314)at org.springframework.data.elasticsearch.core.ElasticsearchTemplate.queryForPage(ElasticsearchTemplate.java:309)at org.springframework.data.elasticsearch.core.ElasticsearchTemplate.queryForPage(ElasticsearchTemplate.java:139)at org.springframework.data.elasticsearch.repository.support.AbstractElasticsearchRepository.search(AbstractElasticsearchRepository.java:214)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:359)at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:200)at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:644)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:608)at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595)at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)at com.sun.proxy.$Proxy63.search(Unknown Source)at com.cntaiping.tpa.db.service.impl.ElasticServiceImpl.highlightQuery(ElasticServiceImpl.java:147)at com.cntaiping.tpa.db.service.impl.ElasticServiceImpl$$FastClassBySpringCGLIB$$74187366.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)at com.cntaiping.tpa.db.service.impl.ElasticServiceImpl$$EnhancerBySpringCGLIB$$ddf33d37.highlightQuery(<generated>)at com.cntaiping.tpa.db.controller.SearchController.query(SearchController.java:91)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)

由于本人能力有限,暂时没有办法解决该异常。

2、通过ElasticsearchTemplate 实现高亮

@Transactional(propagation= Propagation.REQUIRED,isolation= Isolation.DEFAULT)
@Service("elasticService")
public class ElasticServiceImpl implements ElasticService {@Autowired@Qualifier("elasticRepository")private ElasticRepository elasticRepository;@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Overridepublic List<FileBean> highlight(String key,Integer pageNum,Integer pageSize) {BoolQueryBuilder boolQueryBuilder= QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("fileName",key)).should(QueryBuilders.matchQuery("category",key)).should(QueryBuilders.matchQuery("content",key));NativeSearchQuery nativeSearchQuery=new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withHighlightFields(new HighlightBuilder.Field("fileName"),new HighlightBuilder.Field("category"),new HighlightBuilder.Field("content")).withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>")).build();AggregatedPage<ESFileBean> page = elasticsearchTemplate.queryForPage(nativeSearchQuery, ESFileBean.class, new SearchResultMapper() {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {ArrayList<ESFileBean> list = new ArrayList<ESFileBean>();SearchHits hits = response.getHits();for (SearchHit searchHit : hits) {if (hits.getHits().length <= 0) {return null;}Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();Integer fileId=  (Integer) sourceAsMap.get("fileId");String fileName= (String) sourceAsMap.get("fileName");String category= (String) sourceAsMap.get("category");String content= (String) sourceAsMap.get("content");FileBean fileBean = new FileBean();HighlightField field =searchHit.getHighlightFields().get("fileName");if(field==null){fileBean.setFileName(fileName);}else{fileBean.setFileName(field.fragments()[0].toString());}field = searchHit.getHighlightFields().get("category");if(field==null){fileBean.setContent(category);}else{fileBean.setContent(field.fragments()[0].toString());}field = searchHit.getHighlightFields().get("content");if(field==null){fileBean.setContent(content);}else{String hcontent = field.fragments()[0].toString();fileBean.setContent(hcontent);}fileBean.setFileId(Long.valueOf(fileId));list.add(fileBean);}if (list.size() > 0) {return new AggregatedPageImpl<T>((List<T>) list);}return null;}});return page.getContent();}
}
@RequestMapping(value = "/query" )@ResponseBodypublic Page<FileBean> query(String key, String index) throws Exception {System.out.println("(query.do)搜索:"+key);ModelAndView mv = new ModelAndView();if (key == null || key.trim().length() == 0) {System.out.println("输入内容为空!");return null;}//注意:jquery.pagination.js页码从0开始int pageNum = 1;int pageSize=20;if (index!=null&&Integer.parseInt(index)>1){pageNum=Integer.parseInt(index);}...System.out.println("4.--------------");list=elasticService.highlight(key,pageNum,pageSize);System.out.println(list);list.forEach(x->System.out.println(x));return page;}

已经实现高亮

spring-boot-starter-data-elasticsearch整合elasticsearch 6.x实现高亮highlighter解决办法相关推荐

  1. editor.md七牛云上传图片springboot_spring boot 若依系统整合Ueditor,部署时候上传图片错误解决...

    spring boot 若依系统整合Ueditor,部署时候上传图片错误解决 前言:国庆假期找了个ruoyi版本的cms玩玩,从git上看,介绍如下图: 后台部分截图: 编辑 ​ 编辑 ​ 编辑 ​ ...

  2. 自定义 Spring Boot Starter

    一.引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. Starters are a set of convenient dependency descripto ...

  3. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

  4. 手把手教你定制标准 Spring Boot starter

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 写在前面 我们每次构建一个 Spring 应用程序时,我 ...

  5. Spring Boot数据库操作原理及整合druid数据源和mybatis

    在Spring Boot中如果需要访问数据库,我需要导入以下两个依赖: <dependency><groupId>org.springframework.boot</gr ...

  6. 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...

    Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...

  7. 《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》

    目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提 ...

  8. 实现一个 Spring Boot Starter 原来如此简单,读 Starter 源码也不在话下

    我是风筝,公众号「古时的风筝」,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者.现已转行程序员鼓励师 Spring Cloud 系列文章已经完成,可以 ...

  9. 响应式久草编程基础教程:久草Spring Boot 与 Lettuce 在线整合

    本文主要介绍响应式编程访问 Redis,以及 Spring Boot 与 Lettuce 的整合使用. Lettuce 是可扩展性线程安全的 Redis 客户端,用于同步.异步和响应式使用.如果多个线 ...

最新文章

  1. 695.岛屿的最大面积
  2. 2017校赛 问题 F: 懒人得多动脑
  3. FPGA开发之RAM IP的使用
  4. 文巾解题 733. 图像渲染
  5. 如何获取不同网站的favicon默认图标
  6. jmeter接口测试多数据组合登陆场景
  7. 反思拖延症:持续告诉自己立即做立即做;面对困难时要持续坚持;面对困顿时要转变方法
  8. linux之权限管理_1
  9. java学习(113):Calendar类
  10. Linux 答疑:Linux 中 apt 与 apt-get 命令有何区别,我们该选择 apt 还是 apt-get?
  11. 传百度无人车计划分拆,百度回复:不实信息,目前未有分拆计划
  12. firefox使用掘金插件_Mozilla发布新的附加组件来修复旧版Firefox中的扩展禁用问题...
  13. php+分针和时针重合,分针和时针每天重合几次?分别在几点几分重合?怎么计算...
  14. OpenCV:使用python-cv2实现视频的分解与合成
  15. 加密解密技术基础、PKI及创建私有私有CA
  16. 也玩ASP.NET MVC 与 WebFroms 整合
  17. 七月算法机器学习 10 聚类算法与应用
  18. mysql数据库有dbo吗,sql server所有表的所有者恢复为dbo
  19. 计算机组成原理 第三章存储系统 知识点
  20. 手机触摸pass测试软件,PaperPass手机版

热门文章

  1. 尝试制作淘宝的注册协议
  2. Egg.js + MySQL + React + Antd-Mobile 实战移动端私人日记本
  3. 函授大专和成人大专哪个含金量更高
  4. Skype for Business 2015新功能之Web会议安排
  5. 剑指offer编程试题Java实现--64.滑动窗口的最大值
  6. Android系统启动流程(四)Launcher进程启动过程解析(附带面试题)
  7. 解决ios小程序,app底部黑线问题
  8. python项目实战大合集
  9. 思考则第一法则:目的性
  10. 推荐一款文件比较工具Beyond Compare