Lucene近实时搜索应用总结

最近因工作需要,用到了Lucene,在需求中,需要对生成的索引文件不断的更新、新增、删除等操作,同时还要实时的看到索引改动后的数据,在使用过程中碰到了Lucene里几个比较常见的问题,特来总结记录下。

我使用的是Lucene4.3,本来是想使用最高的版本Lucene4.9的(不知道现在又有么有新的版本出现),但是因为公司项目的JDK都是JDK6的,而Lucene4.9的支持的最低JDK版本是7+的,所以最后选择了这个版本。第一次碰这个东东,也是在网上搜罗各种资料,当然官网是少不了的,还有一个网址,这个里面的版本更全面,包含了Lucene所有的版本,有需要的可以去下载自己想要的版本。

OK,进入正题。

  1. 在读取索引文件内容时,索引文件的打开操作 new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File(indexPath)))) 是个非常耗时耗资源的操作,所以在搜索索引数据时把IndexSearcher对象给缓存起来可以提高搜索性能,这个地方可以将索引目录对应的IndexSearcher对象做成一个单例模式进行获取。

  2. 在问题1的操作基础上,我对索引进行了更新操作,紧接着我就发现了一个问题,索引更新后我查询出来的结果和我更新后的结果对不上号。再网上查了半天没找到原因,后来在一个群里请教之后,才知道更新完索引之后,索引文件需要重新打开,否则搜索得到的还是原来索引的数据,Lucene里面的这个原理非常重要。

  3. 因为当时对Lucene了解的不是很多,所以为了每次更新后能搜索到正确的数据,我的做法是每次更新完索引就将我之前缓存的IndexSearcher对象和Reader对象给移除掉,下次搜索时重新打开索引,这样来保证搜索结果的正确性。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×