最近因工作需要,用到了Lucene,在需求中,需要对生成的索引文件不断的更新、新增、删除等操作,同时还要实时的看到索引改动后的数据,在使用过程中碰到了Lucene里几个比较常见的问题,特来总结记录下。
我使用的是Lucene4.3,本来是想使用最高的版本Lucene4.9的(不知道现在又有么有新的版本出现),但是因为公司项目的JDK都是JDK6的,而Lucene4.9的支持的最低JDK版本是7+的,所以最后选择了这个版本。第一次碰这个东东,也是在网上搜罗各种资料,当然官网是少不了的,还有一个网址,这个里面的版本更全面,包含了Lucene所有的版本,有需要的可以去下载自己想要的版本。
OK,进入正题。
在读取索引文件内容时,索引文件的打开操作
new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File(indexPath))))
是个非常耗时耗资源的操作,所以在搜索索引数据时把IndexSearcher
对象给缓存起来可以提高搜索性能,这个地方可以将索引目录对应的IndexSearcher
对象做成一个单例模式进行获取。在问题1的操作基础上,我对索引进行了更新操作,紧接着我就发现了一个问题,索引更新后我查询出来的结果和我更新后的结果对不上号。再网上查了半天没找到原因,后来在一个群里请教之后,才知道更新完索引之后,索引文件需要重新打开,否则搜索得到的还是原来索引的数据,Lucene里面的这个原理非常重要。
因为当时对
Lucene
了解的不是很多,所以为了每次更新后能搜索到正确的数据,我的做法是每次更新完索引就将我之前缓存的IndexSearcher
对象和Reader
对象给移除掉,下次搜索时重新打开索引,这样来保证搜索结果的正确性。