Elasticsearch8.18.8 Java API Client实现mysql数据同步到elasticsearch,并可以实现高级搜索高亮显示,提取泛型方法,可以支持多个实体类es数据写入
elasticsearch版本8.18.8同步MySQL数据到elasticsearchimportco.elastic.clients.elasticsearch.ElasticsearchClient;importco.elastic.clients.elasticsearch.indices.CreateIndexRequest;importorg.springframework.beans.BeanUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.io.IOException;importjava.util.List;ServicepublicclassArticleEsServiceImplimplementsIArticleEsService{AutowiredprivateRemoteArticleServiceremoteArticleService;AutowiredprivateElasticsearchClientclient;//elasticsearch新建的索引名privatefinalStringINDEX_NAMEarticle;OverridepublicvoidinitArticleEs()throwsIOException{//删库 保证配置是最新的booleanvalueclient.indices().exists(e-e.index(INDEX_NAME)).value();//存在该库 则删除if(value){client.indices().delete(d-d.index(INDEX_NAME));}//建库 numberOfShards-分片数 numberOfReplicas--副本数量 建立映射//将需要高级搜索的字段放到elasticsearch中并配置分词器CreateIndexRequestrequestCreateIndexRequest.of(r-r.index(INDEX_NAME).settings(s-s.numberOfShards(1).numberOfReplicas(1)).mappings(m-m.properties(id,p-p.long_(l-l)).properties(title,p-p.text(t-t.analyzer(ik_max_word))).properties(subTitle,p-p.text(t-t.analyzer(ik_max_word))).properties(summary,p-p.text(t-t.analyzer(ik_max_word)))));client.indices().create(request);System.out.println(article es 建库成功);//查询mysqlListArticlearticlesremoteArticleService.list(inner).getData();//同步mysql数据到esfor(Articlearticle:articles){ArticleEsarticleEsnewArticleEs();//相同名字的属性进行拷贝BeanUtils.copyProperties(article,articleEs);client.index(i-i.index(INDEX_NAME).id(articleEs.getId().toString()).document(articleEs));}}}高级搜索高亮显示importco.elastic.clients.elasticsearch.ElasticsearchClient;importco.elastic.clients.elasticsearch.core.SearchResponse;importco.elastic.clients.elasticsearch.core.search.Highlight;importco.elastic.clients.elasticsearch.core.search.HighlightField;importco.elastic.clients.elasticsearch.core.search.Hit;importco.elastic.clients.elasticsearch.core.search.HitsMetadata;importorg.apache.commons.beanutils.BeanUtils;AutowiredprivateElasticsearchClientclient;AutowiredprivateRemoteArticleServiceremoteArticleService;//具体实现方法 通过指定的查询条件进行查询privateObjectsearchArticle(SearchQueryquery)throwsIOException,InvocationTargetException,IllegalAccessException{//设置高亮的内容 和 高亮显示的内容样式MapString,HighlightFieldfieldMapnewHashMap();fieldMap.put(title,HighlightField.of(h-h));fieldMap.put(subTitle,HighlightField.of(h-h));fieldMap.put(summary,HighlightField.of(h-h));HighlighthighlightHighlight.of(h-h.fields(fieldMap).preTags(span stylecolor:red).postTags(/span));//获取结果集 设置查询的elasticsearch索引名分页数据字段的查询条件添加高亮设置(不添加默认是em/em包围)SearchResponseArticleEsrespclient.search(s-s.index(article).from((query.getCurrentPage()-1)*query.getPageSize()).size(query.getPageSize()).query(q-q.multiMatch(m-m.fields(title,subTitle,summary).query(query.getKeyword()))).highlight(highlight),ArticleEs.class);//获取到返回的数据集HitsMetadataArticleEshitsresp.hits();//结果数据的总条数longtotalhits.total().value();//结果数据集已高亮显示的内容ListHitArticleEshitListhits.hits();//存放返回的原mysql数据ListArticlearticlesnewArrayList();//遍历拿到的elasticsearch数据结果集for(HitArticleEshit:hitList){//获取到idLongidLong.valueOf(hit.id());//通过id查询对应的MySQL数据内容ArticlearticleremoteArticleService.getOne(id,SecurityConstants.INNER).getData();//返回的高亮数据集进行遍历MapString,ListStringhighlightMaphit.highlight();for(Stringkey:highlightMap.keySet()){//通过stringBuffer进行拼接StringBufferstringBuffernewStringBuffer();highlightMap.get(key).forEach(stringBuffer::append);StringvaluestringBuffer.toString();//进行实体类的复制 通过key更改value值BeanUtils.setProperty(article,key,value);}//放到返回的结果集中articles.add(article);}//设置分页PageablepageablePageRequest.of(query.getCurrentPage()-1,query.getPageSize());//返回高亮查询的结果集returnnewPageImplArticle(articles,pageable,total);}通过泛型实现通用方法es写入在开发中可能不止一个文章实体类的内容需要放入到es中比如笔记、攻略等不同的实体类查询部分代码有冗余可以写成泛型的形式去进行数据的高亮查询接口importorg.springframework.data.domain.Page;importjava.io.IOException;importjava.lang.reflect.InvocationTargetException;publicinterfaceISearchService{/* T表示MySQL中的实体类类型 例Article K表示elasticsearch中索引的类型 例ArticleEs 参数index-es库名 clazz-MySQL中实体类的字节码 esCalzz--es中类的字节码 fields-要查哪些列 */T,KPageTsearchWithHighlight(StringindexName,ClassTclazz,ClassKesCalzz,SearchQueryquery,String...fields)throwsIOException,InvocationTargetException,IllegalAccessException;}实现类importco.elastic.clients.elasticsearch.ElasticsearchClient;importco.elastic.clients.elasticsearch.core.SearchRequest;importco.elastic.clients.elasticsearch.core.SearchResponse;importco.elastic.clients.elasticsearch.core.search.Highlight;importco.elastic.clients.elasticsearch.core.search.HighlightField;importco.elastic.clients.elasticsearch.core.search.Hit;importco.elastic.clients.elasticsearch.core.search.HitsMetadata;importorg.apache.commons.beanutils.BeanUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageImpl;importorg.springframework.data.domain.PageRequest;importorg.springframework.data.domain.Pageable;importorg.springframework.stereotype.Service;importjava.io.IOException;importjava.lang.reflect.Array;importjava.lang.reflect.InvocationTargetException;importjava.util.*;ServicepublicclassSearchServiceImplimplementsISearchService{AutowiredprivateElasticsearchClientclient;//因为是springcloud项目所以通过feign进行调用AutowiredprivateRemoteStrategyServiceremoteStrategyService;AutowiredprivateRemoteNoteServiceremoteNoteService;AutowiredprivateRemoteArticleServiceremoteArticleService;/* 参数 1.es中的索引名 2.MySQL中的实体类 3.对应es中的实体类 4.查询参数 5.es实体类对应的字段数组 */OverridepublicT,KPageTsearchWithHighlight(StringindexName,ClassTclazz,ClassKesCalzz,SearchQueryquery,String...fields)throwsIOException,InvocationTargetException,IllegalAccessException{//高亮配置MapString,HighlightFieldhighlightFieldsnewHashMap();for(Stringfield:fields){highlightFields.put(field,HighlightField.of(h-h));}//设置高亮显示条件HighlighthighlightHighlight.of(h-h.preTags(span stylecolor:red).postTags(/span).fields(highlightFields));//查询条件 分页条件 设置高亮条件并设置分词器SearchResponseKrespclient.search(s-s.index(indexName).from((query.getCurrentPage()-1)*query.getPageSize()).size(query.getPageSize()).query(q-q.multiMatch(m-m.query(query.getKeyword()).fields(Arrays.asList(fields)).analyzer(ik_max_word))).highlight(highlight),esCalzz);//获取到查询的数据集HitsMetadataKhitsresp.hits();//获取到查询到的总条数longtotalhits.total().value();//拿到查询到的数据ListHitKhitListhits.hits();//创建空集合供存入返回数据集ListTresultsnewArrayList();//遍历es查询到的数据将高亮数据写入到MySQL中for(HitKhit:hitList){LongidLong.valueOf(hit.id());Ttnull;//MySQL元数据if(strategy.equals(indexName)){t(T)remoteStrategyService.getOne(id,inner).getData();}elseif(note.equals(indexName)){t(T)remoteNoteService.getOne(id,inner).getData();}elseif(article.equals(indexName)){t(T)remoteArticleService.getOne(id,inner).getData();}//取高亮数据MapString,ListStringhighlightMaphit.highlight();StringBufferbuffernewStringBuffer();SetStringkeySethighlightMap.keySet();for(Stringkey:keySet){//进行数据拼接highlightMap.get(key).forEach(buffer::append);BeanUtils.setProperty(t,key,buffer.toString());}results.add(t);}//添加分页条件PageablepageablePageRequest.of(query.getCurrentPage()-1,query.getPageSize());//返回带有分页条件的数据returnnewPageImpl(results,pageable,total);}}

相关新闻

基于IPD的研发研发项目范围管理

基于IPD的研发研发项目范围管理

绑定资源目录: 2024版基于华为IPD与质量管理体系融合的研发质量管理【63页】.pptx IPD-TR1评审要素表.doc IPD-TR2评审要素表.doc IPD-TR3评审要素表.doc IPD-TR4评审要素表.doc IPD-TR5评审要素表.docx IPD产品开发流程.ppt IPD流程操作细则(55页).pdf IPD流程管理”专题研…

2026/8/22 12:41:46 阅读更多 →
Codex2API Docker 使用宿主机代理:OAuth Token 兑换 403 问题排查与解决方案

Codex2API Docker 使用宿主机代理:OAuth Token 兑换 403 问题排查与解决方案

Codex2API Docker 使用宿主机代理:OAuth Token 兑换 403 问题排查与解决方案1. 问题描述在 Linux 服务器上通过 Docker Compose 部署 Codex2API,宿主机已经配置本地代理:export http_proxyhttp://127.0.0.1:7890 export https_proxyhttp://12…

2026/8/22 12:56:25 阅读更多 →
数学建模核心算法:从最小二乘到正则化,掌握拟合算法原理与MATLAB/Python实战

数学建模核心算法:从最小二乘到正则化,掌握拟合算法原理与MATLAB/Python实战

1. 项目概述:从“猜”到“算”,拟合算法的核心价值干了这么多年数学建模,带过不少学生队伍,我发现一个挺有意思的现象:很多同学一听到“算法”就觉得高深莫测,尤其是“拟合算法”,总觉得是那些搞…

2026/8/22 11:34:41 阅读更多 →

最新新闻

StringBuilder 和 StringBuffer常用方法全解

StringBuilder 和 StringBuffer常用方法全解

ps.StringBuilder 和 StringBuffer用法一致,StringBuffer适用于多线程,但速度较慢,StringBuilder反之。特殊:StringBuilder数组// 第1步:创建数组(相当于买了一个有3个隔层的书包) StringBuilde…

2026/8/22 16:31:39 阅读更多 →
万字干货 | Prompt、Context、Harness、Loop和Graph:从AI到系统

万字干货 | Prompt、Context、Harness、Loop和Graph:从AI到系统

最近读完了小枣君(周圣君,鲜枣课堂)写的《通信简史》。这本书从技术史、企业史和人物史三个维度展开,没有把通信史写成一串孤立的发明,而是把技术演进、企业发展与人物选择放在同一段历史中。书中保留了必要的专业细节…

2026/8/22 16:31:39 阅读更多 →
游戏画面模糊真是显卡的锅吗?DLSS Swapper 一键换掉游戏里的 DLSS 版本

游戏画面模糊真是显卡的锅吗?DLSS Swapper 一键换掉游戏里的 DLSS 版本

游戏画面模糊真是显卡的锅吗?DLSS Swapper 一键换掉游戏里的 DLSS 版本 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 上周末我把游戏开到 4K、DLSS 切到质量模式,本以为能爽上一把&#xff0c…

2026/8/22 16:31:39 阅读更多 →
单片机毕业设计实战:从硬件到云端的物联网系统开发指南

单片机毕业设计实战:从硬件到云端的物联网系统开发指南

最近在准备单片机毕业设计的同学,是不是经常听到“从夯到拉锐平”这个说法,然后一头雾水?这听起来像是一句黑话,或者某个神秘的技术栈。其实,它背后反映的是一个非常普遍且真实的毕业设计困境:从硬件&#…

2026/8/22 16:31:39 阅读更多 →
Akagi 雀魂AI助手指南:免费实时麻将分析与AI建议,5分钟上手

Akagi 雀魂AI助手指南:免费实时麻将分析与AI建议,5分钟上手

Akagi 雀魂AI助手指南:免费实时麻将分析与AI建议,5分钟上手 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Ri…

2026/8/22 16:31:39 阅读更多 →
HsMod:炉石增强插件,60+功能覆盖MMR、换肤与挂机

HsMod:炉石增强插件,60+功能覆盖MMR、换肤与挂机

HsMod:炉石增强插件,60功能覆盖MMR、换肤与挂机 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 想给英雄换皮肤得改配置再模拟断线,酒馆战棋里想看对手隐…

2026/8/22 16:30:38 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →