Springboot + Lucene实现全文检索

type
status
date
slug
summary
tags
category
icon
password
😀
本文仅介绍Springboot如何集成lucene并实现全文检索、高亮检索和分页检索,至于lucene详细情况请看后续文章。 JDK:8 SpringBoot: 2.7.3
先看项目结构
notion image
 

0.准备数据

1.引入相关依赖

这里需要注意lucene的版本和jdk版本,高版本的lucene(9.3.0及以后)使用了Java11,本文以Jdk8为准。

2.配置Lucene和IK分词器

为了避免频繁创建IndexWriter、IndexSearch和Analyzer等实例,这里配置为bean,交由Spring管理。注意,IndexSearcher需要及时获取索引的更改,否则只能查到启动时第一次加载的索引,因此将它托管给SearchManager,并创建守护线程,定时让SearchManager更新IndexSearch的索引库,这个时间是可以自定义的,这里设置的上限是5秒,下限是25毫秒

3.创建dao层mapper及CRUD方法

这里就不详细展示了,自己根据表结构创建对应model和mapper接口,本文使用了MybatisPlus.

4.初始化创建索引

继承ApplicationRunner ,在项目启动时将数据库中的数据取出来,创建索引

5.各种功能实现

IK扩展词处理

IK扩展词,简单来说就是让IK分词器单独加载额外的词典,这个词典中词不会被IK分词器再分词,认为是一个整体。
 
举个例子,对于“MySQL数据库”这个词,正常来说,IK分词器可能会将其分为“MySQL”和“数据库”两个词,但有时我认为它们就是一个词,不该再分,就需要将“MySQL数据库”加入IK扩展词中。另外,对于这些分词检索没有太大意义的词,我们可以过滤掉,不参与检索。
 
具体使用方式如下:
notion image
依据上图,在资源目录下新增三个文件。
IKAnalyzer.cfg.xml
extend.dic
stop.dic
注意,设置扩展词后,需重新创建索引,否则不生效,并且要确保IK扩展词这三个文件在打包时,必须要打进包中。

📎 参考文章

  • GitTalk

© aya 2024-2025