spring-boot-starter-data-elasticsearch整合elasticsearch 6.x实现高亮highlighter解决办法
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解决办法相关推荐
- editor.md七牛云上传图片springboot_spring boot 若依系统整合Ueditor,部署时候上传图片错误解决...
spring boot 若依系统整合Ueditor,部署时候上传图片错误解决 前言:国庆假期找了个ruoyi版本的cms玩玩,从git上看,介绍如下图: 后台部分截图: 编辑 编辑 编辑 ...
- 自定义 Spring Boot Starter
一.引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. Starters are a set of convenient dependency descripto ...
- spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)
上一篇:spring boot 1.5.4 整合webService(十五) 1 Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...
- 手把手教你定制标准 Spring Boot starter
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 写在前面 我们每次构建一个 Spring 应用程序时,我 ...
- Spring Boot数据库操作原理及整合druid数据源和mybatis
在Spring Boot中如果需要访问数据库,我需要导入以下两个依赖: <dependency><groupId>org.springframework.boot</gr ...
- 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...
Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...
- 《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》
目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提 ...
- 实现一个 Spring Boot Starter 原来如此简单,读 Starter 源码也不在话下
我是风筝,公众号「古时的风筝」,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者.现已转行程序员鼓励师 Spring Cloud 系列文章已经完成,可以 ...
- 响应式久草编程基础教程:久草Spring Boot 与 Lettuce 在线整合
本文主要介绍响应式编程访问 Redis,以及 Spring Boot 与 Lettuce 的整合使用. Lettuce 是可扩展性线程安全的 Redis 客户端,用于同步.异步和响应式使用.如果多个线 ...
最新文章
- 695.岛屿的最大面积
- 2017校赛 问题 F: 懒人得多动脑
- FPGA开发之RAM IP的使用
- 文巾解题 733. 图像渲染
- 如何获取不同网站的favicon默认图标
- jmeter接口测试多数据组合登陆场景
- 反思拖延症:持续告诉自己立即做立即做;面对困难时要持续坚持;面对困顿时要转变方法
- linux之权限管理_1
- java学习(113):Calendar类
- Linux 答疑:Linux 中 apt 与 apt-get 命令有何区别,我们该选择 apt 还是 apt-get?
- 传百度无人车计划分拆,百度回复:不实信息,目前未有分拆计划
- firefox使用掘金插件_Mozilla发布新的附加组件来修复旧版Firefox中的扩展禁用问题...
- php+分针和时针重合,分针和时针每天重合几次?分别在几点几分重合?怎么计算...
- OpenCV:使用python-cv2实现视频的分解与合成
- 加密解密技术基础、PKI及创建私有私有CA
- 也玩ASP.NET MVC 与 WebFroms 整合
- 七月算法机器学习 10 聚类算法与应用
- mysql数据库有dbo吗,sql server所有表的所有者恢复为dbo
- 计算机组成原理 第三章存储系统 知识点
- 手机触摸pass测试软件,PaperPass手机版