同样,本文的出现,也是我的个人网站笑小枫搭建的过程中产生的,作为一个技术博客为主的网站,Mysql的搜索已经满足不了我的野心了,于是,我便瞄上了全文检索。最初,是打算直接使用比较熟悉的ES,但是考虑到部署ES额外的服务器资源开销,最后选择了Lucene,搭配IK分词器,直接在项目中整合。
看看官网上的介绍吧~
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不认呀,怎么办呢?
还有就是,,这些分词检索没有太大意义的词,我们可以过滤掉,不参与检索。
不说废话,怎么做呢?看图~
添加上图文件即可,生不生效,看高亮就很明显,下文演示。
说说坑哈
坑一:注意打包后有没有文件,如果没有打进去的话,就会不生效
坑二:设置后,需要重新创建索引,不然可能会查不到数据
注意这个名字不能错,放在目录下
对应上面文件中的名字(名字可以自定义,同步修改)和路径,输入多个回车即可
对应上面文件中的名字(名字可以自定义)和路径,输入多个回车即可
设置前:
设置后:
本文到此就结束了,如果帮助到你了,帮忙点个赞👍