推广 热搜:   中国  未来  系统  政策  行业  设备  基金  快速  教师 

SpringBoot整合Lucene实现全文检索【详细步骤】【附源码】

   日期:2024-11-06     作者:caijiyuan    caijiyuan   评论:0    移动:http://mip.tpjde.com/news/429.html
核心提示:同样,本文的出现,也是我的个人网站笑小枫搭建的过程中产生的,作为一个技术博客为主的网站,Mysql的

同样,本文的出现,也是我的个人网站笑小枫搭建的过程中产生的,作为一个技术博客为主的网站,Mysql的搜索已经满足不了我的野心了,于是,我便瞄上了全文检索。最初,是打算直接使用比较熟悉的ES,但是考虑到部署ES额外的服务器资源开销,最后选择了Lucene,搭配IK分词器,直接在项目中整合。

SpringBoot整合Lucene实现全文检索【详细步骤】【附源码】

看看官网上的介绍吧~

Apache Lucene™ is a high-performance, full-featured search engine library written entirely in Java. It is a technology suitable for nearly any application that requires structured search, full-text search, faceting, nearest-neighbor search across high-dimensionality vectors, spell correction or query suggestions.

Apache Lucene is an open source project available for free download.

看不懂,翻译过来就是

Apache Lucene™是一个完全用Java编写的高性能、全功能的搜索引擎库。它是一种几乎适用于任何需要结构化搜索、全文搜索、切面、跨高维向量的最近邻搜索、拼写纠正或查询建议的应用程序的技术。Apache Lucene是一个免费下载的开源项目。

没错,它就是我们需要的全文搜索引擎,接下来让我们一起看看怎么在SpringBoot项目中集成使用它吧。

3.1 引入Lucene依赖和分词器依赖

先看看需要的依赖吧。

算了,还是先说说我的需求吧,算了,没有需求,具体参考百度搜索框吧~反正就是那样

直接上依赖吧,默认分词器对中文不友好。这里使用IK分词器🚀🚀🚀(不多介绍

这里使用可以兼容新版本的lucene。

新版本的lucene和版本冲突,会报以下错误。

解决方案放在源码中了,这里不展开了。使用版本,把和的注释放开就行。

3.2 表结构和数据准备

准备表结构,这里是简化过的表结构,只提供演示效果。

准备测试数据

对数据库的操作使用的Mybatis Plus,这里演示比较简单,只是单纯的取数据,不贴详细代码了,需要的去源码里面获取。不想连数据库可以直接用个List模拟掉,简单的贴个对象吧。

3.3 创建索引

这里直接从数据库查询所有数据,然后创建索引了只为演示,实际使用中根据数据量大小,业务需要哪些字段,是否需要回表查询等等考虑生产方案,。

直接上代码了,索引建在目录下实际使用该封装封装,该放配置放配置哈。这里为了演示效果好(方便你们copy😂,集中都放在这里了。 注释比较详细,不单独介绍功能了。

如果新增数据追加的话,使用模式即可。

创建索引后,在目录下会出现索引文件,如下图

3.4 修改索引

数据变更时,索引应该怎么变更呢?该如何怎么设计呢

  • 在程序中数据变更的时候,更新索引,但是对业务的侵入性比较大。新增、修改、删除时都要多一套操作Lucene的接口。
  • 监听数据库数据变更,然后更新索引,引入额外中间件,复杂度变高。

有舍有得吧,看权衡点在哪了,大家有什么好的方案可以留言哟。😊

修改前搜索

然后将id=808的修改为,更新索引。可以看到数据已变更,但是分词查询,数据仍然查询出来了。

3.5删除索引

只能删除id=808的索引,然后再进行查询,可以看到数据消失了🧐。

4.1 基础搜索

最基础的模糊搜索,功能不用文字解释了,写个sql的案例吧,很明显就能懂。

当然走Lucene支持分词检索,计算得分展示等等,只为了容易懂,不杠…

可以看到 中包含的数据都搜索出来了

4.2 一个关键词,在多个字段里面搜索

关键词在和两个字段里面检索,类似于下面的sql。

可以看到和中包含的数据都搜索出来了

4.3 搜索结果高亮显示

这个功能基本必备吧,让用户明确知道搜索的匹配程度

因为创建索引的时候description设置的Field.Store.NO,所以这里doc没有description数据,取不出来值,故不做高亮,当然,从数据库中查询出来再做高亮也是可以的。

4.4 分页检索

不多说,你需要的我都整活,直接上代码,分页直接再程序中写死了,正常需要传分页参数,返回分页数据,总条数等,不利于演示,和普通分页一样,自己封装吧😅

第一页数据

第二页数据

手动修改保证没偷懒😁😁😁~

4.5多个关键词搜索

最起码满足你的日常使用吧。

什么是扩展词呢?字面意思。

就如,我认为它是一个完整的词汇,但是人家IK不认呀,怎么办呢

还有就是,这些分词检索没有太大意义的词,我们可以过滤掉,不参与检索。

不说废话,怎么做呢?看图~

添加上图文件即可,生不生效,看高亮就很明显,下文演示。

说说坑哈

坑一:注意打包后有没有文件,如果没有打进去的话,就会不生效

坑二:设置后,需要重新创建索引,不然可能会查不到数据

注意这个名字不能错,放在目录下

对应上面文件中的名字(名字可以自定义,同步修改)和路径,输入多个回车即可

对应上面文件中的名字(名字可以自定义)和路径,输入多个回车即可

设置前

设置后

本文到此就结束了,如果帮助到你了,帮忙点个赞👍

本文地址:http://www.tpjde.com/news/429.html    推平第 http://www.tpjde.com/ , 查看更多
 
 
更多>同类行业资讯
0相关评论

新闻列表
企业新闻
推荐企业新闻
推荐图文
推荐行业资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2023001713号