游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

SpringBootVueES实现仿百度全文搜索

  今天要聊的就是博客管理中全文搜索的实现,基于SpringBootVueES实现,先给大家看一下效果:
  全文搜索关键字高亮,是不是和百度的效果差不多,话不多说,直接聊如何实现。
  该网站前端是仿一个开源项目,本人主要是做后端,所以本教程涉及前端的部分会直接给代码,不做深入讲解数据准备
  首先我们的数据是存放在Mysql的,建表语句如下,再利用MybatisPlus实现普通查询,比较简单,也不是本文重点,不做赘述。createtablecodenote(idbigintnotnullautoincrement,titlevarchar(128)notnulldefaultcomment标题,mdcontenttextcommentmd文本,htmlcontenttextcommenthtml文本,summaryvarchar(256)comment摘要,categoryvarchar(10)comment分类,typetinyintnotnulldefault0comment类型:0文字;1视频,createtimedatetimenotnullcomment创建时间,publishtimedatetimenotnullcomment发布时间,statustinyintDEFAULT0COMMENT0草稿箱;1已发表;2已删除,primarykey(id));INSERTINTOyitiaoadmin。codenote(id,title,author,mdcontent,htmlcontent,summary,category,type,createtime,publishtime,status)VALUES(14,一条,yitiao,canal,pcanal,null,默认,null,2023013010:28:17,2023013010:28:17,1);复制代码前端页面
  前端是基于elementui来实现的,从文档找了半天,决定用table来实现,如果有更好的实现方式可以评论区留言。
  其实就是只有的一列的无边框的表格,表格内又嵌入文本和按钮,再就是一些样式的调整,关键代码如下:eltable:datasearchTableDatavifsearchShoweltablecolumnlabelwidth800bordertemplatedefaultscopeelbuttontypetextsizemediumstyleborder:none;fontsize:largeclickdetails(scope。row)spanvhtmlscope。row。esTitlespanelbuttonspan{{scope。row。author}}spanspanstylemarginleft:10px{{scope。row。createTime}}spantemplateeltablecolumneltable复制代码
  查询和全文搜索按钮的切换使用的vifsearchShow,向后端发请求的部分如下:fullSearch(){this。searchShowtrue;this。pageShowfalse;if(this。searchthis。searchnull){this。searchspring}request。get(esnotegetByContent,{params:{pageNum:this。currentPage,pageSize:this。pageSize,content:this。search}})。then(res{console。log(res)this。searchTableDatares。data})}复制代码Docker安装ES
  终于要到正题啦,因为ES非常的耗内存,我的服务器剩余内存只有不到2G,所以选择用Docker部署单机版的ES。sudodockerpullelasticsearch:7。12。0创建挂载目录config、data、plugins,开启全部权限chmodR777dataoptes创建配置文件cdconfigvimelasticsearch。ymlhttp。host:0。0。0。0启动容器sudodockerrunnameelasticsearchp9200:9200p9300:9300ediscovery。typesinglenodeeESJAVAOPTSXms84mXmx512mvdataoptesconfigelasticsearch。yml:usrshareelasticsearchconfigelasticsearch。ymlvdataoptesdata:usrshareelasticsearchdatavdataoptesplugins:usrshareelasticsearchpluginsdelasticsearch:7。12。0查看ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志adockerlogselasticsearch复制代码
  测试正常启动页面:http:101。43。138。173:9200
  插件使用
  集群黄色解决
  我们的elasticsearch是单节点的,只有一个主服务没有从服务,也就是说所以最简单的办法就是在创建索引的时候将备份数改为0。
  如果我们已经创建了索引,那么我们可以直接更改索引的备份数方法举例如下:请求方式为puturl地址解释:IP地址:端口索引名称settings(settings是接口的固定用法)curlXPUTHContentType:applicationjsond{numberofreplicas:0}http:101。43。138。173:9200codenotesettingsusername:password返回{acknowledged:true}复制代码
  刷新插件,集群变成绿色。
  设置用户名密码vimelasticsearch。ymlhttp。cors。enabled:truehttp。cors。alloworigin:http。cors。allowheaders:Authorizationxpack。security。enabled:truexpack。security。transport。ssl。enabled:true复制代码dockerexecitfa41ca453d06binbash。binelasticsearchsetuppasswordsinteractive输入密码复制代码
  设置成功后,用户名为elastic,密码为设置的值,同时es里多了一个索引:。security7
  安装分词器
  下载,版本一定要和es的对应,安装时注意,并不是一解压就好了。
  首先查看插件的名字,解压后打开plugindescriptor。properties文件,查看插件的名字,然后在挂载的plugins文件夹下新建文件夹,以插件的名字命名。
  再将解压出来文件全部移动到插件名文件夹下才可以。
  重启ES,查看日志dockerrestartfa41ca453d06dockerlogsfa41ca453d06复制代码
  至此,ES服务端部署完成,接下来就是基于SpringBoot操作ES。Java客户端
  springbootstarterdataelasticsearch是比较好用的一个elasticsearch客户端,它内部会引入springdataelasticsearch。
  版本对应关系
  如果使用springbootstarterdataelasticsearch,需要调整springboot的版本才起作用。
  有下边这几种方法操作ElasticSearch:ElasticsearchRepository(传统的方法,可以使用)ElasticsearchRestTemplate(推荐使用。基于RestHighLevelClient)ElasticsearchTemplate(ES7中废弃,不建议使用。基于TransportClient)RestHighLevelClient(推荐度低于ElasticsearchRestTemplate,因为API不够高级)TransportClient(ES7中废弃,不建议使用)
  案例代码
  配置dependencygroupIdorg。springframework。bootgroupIdspringbootstarterdataelasticsearchartifactIdversion2。7。7versiondependency复制代码spring:elasticsearch:rest:uris:101。43。138。173:9200多个用逗号隔开username:用户名password:密码connectiontimeout:1000连接超时时间readtimeout:1000读取超时时间复制代码
  索引类省略部分字段DataDocument(indexNamecodenote)Setting(replicas0)副本为0,单机模式NoArgsConstructorAllArgsConstructorBuilderpublicclassEsCodeNote{IdprivateLongid;md文本Field(typeFieldType。Text,analyzerikmaxword)privateStringmdContent;分类Field(typeFieldType。Keyword)privateStringcategory;创建时间Field(typeFieldType。Date,formatDateFormat。custom,patternyyyyMMddHH:mm:ssyyyyMMddepochmillis)privateDatecreateTime;}复制代码
  mapper类RepositorypublicinterfaceCodeNoteRepositoryextendsElasticsearchRepositoryEsCodeNote,String{}复制代码
  service层ServiceSlf4jRequiredArgsConstructorpublicclassCodeNoteService{privatefinalElasticsearchRestTemplateesRestTemplate;privatefinalCodeNoteRepositorycodeNoteRepository;privatefinalCodeNoteMappernoteMapper;publicObjectsaveNoteToEs(EsCodeNotecodeNote){returncodeNoteRepository。save(codeNote);}publicvoidsaveNotesToEs(ListEsCodeNotecodeNotes){codeNoteRepository。saveAll(codeNotes);}publicListEsCodeNotegetFromEsByContent(Stringcontent){高亮StringpreTagfontcolorred;StringpostTagfont;BoolQueryBuilderboolQueryBuildernewBoolQueryBuilder()。should(newMatchQueryBuilder(mdContent,content));QueryquerynewNativeSearchQueryBuilder()。withQuery(boolQueryBuilder)。withHighlightFields(newHighlightBuilder。Field(mdContent)。preTags(preTag)。postTags(postTag))。build();Queryquery1newNativeSearchQueryBuilder()。withQuery(QueryBuilders。multiMatchQuery(content,content,content。inner))。build();。withQuery(QueryBuilders。queryStringQuery(content))。build();SearchHitsEsCodeNotesearchesRestTemplate。search(query,EsCodeNote。class);returnsearch。stream()。map(SearchHit::getContent)。collect(Collectors。toList());}publicvoidinit(){ListCodeNotecodeNotesnoteMapper。selectList(Wrappers。lambdaQuery(CodeNote。class));ListEsCodeNoteesCodeNotesBeanUtil。copyToList(codeNotes,EsCodeNote。class);this。saveNotesToEs(esCodeNotes);}}复制代码
  controllerRestControllerRequestMapping(es)Slf4jRequiredArgsConstructorpublicclassEsRestController{privatefinalCodeNoteServicenoteService;PostMapping(init)publicResultObjectcreateIndex(){noteService。init();returnResult。success(initallnotessuccess);}GetMapping(notegetByContent)publicResultListEsCodeNotegetByContent(RequestParam(content)Stringcontent){returnResult。success(noteService。getFromEsByContent(content));}}复制代码
  测试
  先初始化全部数据
  根据mdContent分词查询
  至此后端的高亮查询已经实现,如果与前端结合,还需要对查询结果做进一步封装和处理。前后端联调
  后端构建返回VOpublicclassEsCodeNoteRes{privateLongid;题目privateStringesTitle;privateStringauthor;md文本privateStringesContent;html文本privateStringhtmlContent;省略部分发布时间JsonFormat(patternyyyyMMdd,timezoneGMT8)privateDatepublishTime;}复制代码
  对返回的结果封装SearchHitsEsCodeNotesearchHitsesRestTemplate。search(query,EsCodeNote。class);returnsearchHits。stream()。map(search{EsCodeNoteesCodeNotesearch。getContent();search。getHighlightFields()。forEach((k,v){log。info(highlightkeyis〔{}〕,contentis〔{}〕,k,v。get(0));分别处理标题和正文if(k。equals(title)){esCodeNote。setTitle(v。get(0));}if(k。equals(mdContent)){esCodeNote。setMdContent(v。get(0));}});如果正文里没有关键字,取前100字符if(!esCodeNote。getMdContent()。contains(postTag)){esCodeNote。setMdContent(esCodeNote。getMdContent()。substring(0,100));}returnEsCodeNoteRes。builder()。id(esCodeNote。getId())。esTitle(esCodeNote。getTitle())。author(esCodeNote。getAuthor())。esContent(esCodeNote。getMdContent())。htmlContent(esCodeNote。getHtmlContent())。summary(esCodeNote。getSummary())。category(esCodeNote。getCategory())。createTime(esCodeNote。getCreateTime())。publishTime(esCodeNote。getPublishTime())。build();})。collect(Collectors。toList());复制代码
  结果展示
  道阻且长,行则将至。2023,扬帆起航。
  原文链接:https:juejin。cnpost7194734486327099429

秋天,遇到ampampquot不老菜ampampquot敞开世界卫生组织向全球推荐的十大健康蔬菜中,包菜排名第三!别看包菜不打眼、甚至因为价格低廉经常被人忽略,但却是目前发现的天然叶酸含量最高的蔬菜,不但如此,包菜中还含有大量的维生素C……大博弈结局马怡父亲不慎坠楼,刘必定复婚再入狱虽然《大博弈》的国企改革很多观众表示看不懂,但是孙和平、杨柳和刘必定之间的勾心斗角、暗流涌动,想必观众一定看懂了。在生意场上没有绝对的友情,他们三人的命运在最后的大结局中……苹果解释为何部分用户申请AppleCard被拒绝信用额度个人IT之家8月15日消息苹果推出的AppleCard信用卡已经在部分国家和地区可以使用,虽然有一部分信用分已经满足,但是在申请过程中,仍有人被拒。针对这一问题,苹果方面更新了相关……在欧盟涉逃税130亿欧元,苹果今日出庭辩护9月17日消息,据国外媒体报道,鉴于爱尔兰多年来向苹果提供非法的税收优惠,让苹果享受了比其它企业低得多的税务负担,欧盟反垄断机构要求苹果补交大约130亿欧元(约合144亿美元)……苹果iPhone11ProMax真机提前开箱黑色包装盒,附带IT之家9月17日消息直到9月20日,苹果才正式向全球首批客户交付新款iPhone11、iPhone11Pro、iPhone11ProMax。今天消息称iPhone11首批订单……正式版推送一周后,苹果iOS13设备采用率超过20IT之家9月27日消息苹果9月20日正式发布iOS13系统更新,现在似乎有了不错的开端。根据Mixpanel的数据,一周之后,iOS13在iPhone、iPad设备上的采用率超……泰国人妖怎么才能分辨出来?牢记三点,不得罪人,看得准泰国是人们非常喜爱的一个旅游国家,每年都会有大批的来自世界各国的游客前去泰国旅游。(此处已添加小程序,请到今日头条客户端查看)泰国旅游一个很重要的环节就是人妖,人妖可以说……苹果全新专利曝光iPhone的苹果标志将可用于通知提醒IT之家9月27日消息未来的iPhone背部Logo将会加入一些电子控制的装饰元素从而让用户的iPhone更具个性,同时Apple徽标颜色的变化也将可以起到提醒用户的作用。而近……无刘海顶框式FaceID!苹果6。7寸iPhone原型机曝光IT之家9月27日消息随着苹果iPhone11系列手机正式发售,外界除了将眼光放到了今年苹果新iPhone的销量上以外还不断关注着苹果下一代iPhone的进展。近日有外国网友便……荣耀60和vivoS12有什么区别?规格参数荣耀60采用骁龙778GLPDDR4X内存UFS2。2闪存的性能组合,6。67英寸OLED双曲面屏,1080P分辨率,120Hz刷新率,300Hz触控采样率,居中……纽伯瑞儿童文学金奖作家房龙,写给孩子们看的人类文明启蒙课人类是何时、为何有如何在地球开始它的历史的?人类文明是如何发展的?我们对人类文明的发源和发展,充满了好奇,总一探究竟。荷兰裔美籍学者、教授兼作家房龙为孩子们写下的《文明的……高通诉苹果专利侵权案庭审结束,高通要求3100万美元赔偿3月14日消息,据国外媒体报道,当地时间周三高通诉苹果专利侵权一案在圣地亚哥联邦地方法院庭审结束。双方分别做出结案陈词,由8人组成的陪审团随后将作出裁决。据悉,此次诉讼涉……
一年级优等生期末评语评语是对学生一学期来德、智、体等方面作出的全面总结和评价。对学生进行操行评定是对学生进行教育的重要手段,也是班主任的一项重要工作内容;下面是有一年级优等生期末评语,欢迎参阅。一……外贸会计专业毕业生自荐信范文尊敬的领导:您好!首先衷心感谢您在百忙之中审阅我的自荐信。我叫XX,今年XX岁,毕业于XX职业学院外贸会计专业。虽然我毕业于一所民办院校,但我却拥有一颗不甘于……国家励志奖学金申请书范文3篇国家励志奖学金是为了激励普通本科高校、高等职业学校和高等专科学校的家庭经济困难学生勤奋学习、努力进取,在德、智、体、美等方面全面发展,由中央和地方政府共同出资设立的,奖励资助品……实用主题教育活动总结合集六篇一次欢乐的活动结束了,在这段活动中,一定有很多值得分享的体会吧,你会有什么样的总结呢?但是拿起笔的时候却发现不知道写什么,下面是关于主题教育活动总结6篇,仅供参考,欢迎大家阅读……浙江省公路水运工程试验检测信用评价实施细则3月实施近日,浙江省交通运输厅印发的《浙江省公路水运工程试验检测信用评价实施细则》,对公路水运工程试验检测从业人员的失信行为、试验检测机构信用评价中断等情况作出了明确规定。本《实施细则……又是23落后,这次绿军能否再次上演逆转雄鹿一幕,苏群给出见解目前NBA总决赛的比赛正在火热进行,在上一场的天王山之战中,勇士凭借主场优势顺利拿下了比赛,目前已经是大比分32领先绿军,本赛季的总冠军最快将会在下场比赛中诞生,但显然绿军肯定……安徽庐江千亩李树花似锦来源:人民网安徽频道庐江县万山镇处处春意盎然。千亩李树花似锦。千亩李树花似锦。千亩李树花似锦。千亩李树花似锦。2023年3月4日,安徽省合肥……续航最长320km,支持快充,轴距2890mm,2022款龙近日,汽车子弹从厦门金龙官方获悉,2022款龙耀8上市,新车为定义为纯电轻客,此次共推出了5款车型,官方指导价格为14。97万16。17万元。新车还有哪些亮点呢?下面就跟随汽车……坏消息!卡塔尔世界杯或将禁止以下球员参加C罗在列近日,阿根廷足协主席塔皮亚接受了媒体的采访时,爆出了一个惊人地消息!他声称阿根廷主力中场德保罗有可能将无缘2022卡塔尔世界杯。原因竟是德保罗与前妻卡米拉分手后,就孩子们的抚养……各省市区2022年人均GDP差距有点大人均GDP,是衡量一个地区经济发展程度的核心指标。随着全国2022年经济数据的发布,各省市区的GDP和人均GDP数据也相继出炉。2022年各省市区人均GDP数据比较……广义相对论说空间弯曲,难以理解,推翻这个理论会发生什么?首先我们说,平和不平,平和弯曲,这个都是可以通过测量的手段得到的,不是谁说平就平,谁说不平就不平。至于空间,为什么爱因斯坦的广义相对论说是弯曲的,因为以前人类从来就没有想……探索天津与京津冀协同发展的共赢路径京津冀协同发展战略承担着解决区域发展落差与谋求区域经济增长的双重使命。天津作为京津冀第二大都市和京畿门户,迫切需要立足比较优势,纵深推进京津冀协同发展,深度参与京津冀世界级城市……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网