SpringBoot集成Lucence
Lucence 和全⽂检索
Lucene 是 Apache Jakarta 家族中的⼀个开源项⽬,它不是⼀个完整的搜索应⽤程序,但可为我们的应⽤程序提供索引和搜索功能。Lucene 也是⽬前流⾏的基于 Java 的开源全⽂检索⼯具包。
多应⽤程序基于 Lucene 实现了搜索功能,⽐如 Eclipse 帮助系统的搜索功能。Lucene 能为⽂本类型的数据建⽴索引,我们只要能把需要建⽴索引的数据转化为⽂本格式,Lucene 就能对该⽂档建⽴索引并实现搜索。
⽂件中的数据属于⾮结构化数据,要提⾼搜索效率,⾸先需将⾮结构化数据中的⼀部分信息提取出来,重新组织,使其具有⼀定的结构,然后再对这些结构化的数据进⾏搜索,从⽽达到提⾼搜索效率的⽬的。这⼀过程就是全⽂搜索,即先建⽴索引,再对索引进⾏搜索。
Spring Boot 集成 Lucence
1. 依赖导⼊
⾸先需要导⼊ Lucene 的依赖,它的依赖有好⼏个,如下:
Lucene 默认⽀持英⽂分词,可以增加最后这个依赖,让它⽀持中⽂分词。倒数第⼆个依赖⽀持分词⾼亮,本⽂最后将利⽤它,实现搜索内容的⾼亮显⽰,模拟当前互联⽹上的做法,⼤家可以运⽤到实际项⽬中。
2. 快速⼊门
根据上⽂的分析,全⽂检索有两个步骤,先建⽴索引,再检索。为了测试这个过程,我新建了两个 Java 类,⼀个⽤来建⽴索引,另⼀个⽤来检索。
1)建⽴索引
⾸先,我们可以先在 D:\lucene\data ⽬录下保存⼏个⽂件。然后,新建⼀个 Indexer 类,实现建⽴索引的功能。⾸先在构造⽅法中初始化标准分词器和写索引实例。
如下代码,⾸先将存放索引的⽂件夹路径传⼊构造⽅法中,并构建标准分词器(⽀持英⽂),之后利⽤标准分词器实例化写索引对象。
接下来开始建⽴索引。⼤家可以结合代码注释来理解这⼀构建过程:
这样索引就建好了,我们在该类中写⼀个 main ⽅法测试⼀下:
我从 Tomcat 的 conf ⽬录下拷贝了 catalina.properties 和 logging.properties 两个⽂件,并放在 D:\lucene\data ⽬录下(这两个⽂件也可以在源码中获取)。执⾏上⾯代码,可以看到控制台输出了以下内容:
接着,我们打开 D:\lucene\ ⽬录可以看到⼀些索引⽂件,这些⽂件不能删除,否则需重新构建索引。因为没有索引,便⽆法检索内容了。2)检索内容
这两个⽂件的索引已经建⽴好了,接下来就可以写检索程序了,在这两个⽂件中查特定的词。
OK,检索代码写完了,⼤家可以结合代码注释来理解这段程序。下⾯写个 main ⽅法测试⼀下:
查 security 字符串,执⾏完成后,可以看到控制台打印出如下结果:springboot结构
可以看出,耗时了 23 毫秒后,在其中⼀个⽂件中到了 security 这个字符串,并输出了⽂件的名称。上⾯的代码写得也很详细,⼤家可以应⽤在⽣产环境中。
3. 中⽂分词检索⾼亮
上⽂完成了建⽴索引和检索代码的编写,但在实际项⽬中,往往需在页⾯中将查询结果展⽰出来,⽐如查某个关键字,查到之后,将相关的信息点展⽰出来,并将查询的关键字⾼亮显⽰等等。这种需求在实际项⽬中⾮常常见,⼤多数⽹站上基本都有这种效果。本⽂,我们就使⽤ Lucene 来实现该效果。
1)中⽂分词
⾸先新建 ChineseIndexer 类,⽤来建⽴中⽂索引。中⽂索引与英⽂索引的建⽴过程⼀样,不同之处在于这⾥使⽤的是中⽂分词器。上⾯我们通过读取⽂件建⽴索引,这⾥我们不读取⽂件,直接对⼀个字符串建⽴索引。因为在实际项⽬中,绝⼤部分情况下,会获取⼀些⽂本字符串(⽐如从表中查询出来的结果),然后对该⽂本字符串建⽴索引。
建⽴索引时,⾸先获取 IndexWriter 对象,将相关的内容⽣成索引。索引的 Key 可以根据项⽬的情况⾃定义,内容来⾃我们处理过的⽂本,或者从数据库中查询出来的⽂本。⽣成时,需要使⽤中⽂分词器,代码如下: