lucene不重新打开reader但让索引修改生效的方案

osborn 2013-12-03
老版本的lucene有个reopen方法,可以只重新打开修改过的文档。
lucene从4开始就没有这个方法了,我更新了索引里的文档,只能关闭索引再打开,搜索时才会真正生效。

但是索引比较大,重开后第一次搜索要很长时间。我曾经考虑过重新开一个新的reader实例,然后跟旧的这个做切换,再把旧的关掉。但是打开索引需要消费不少内存,如果同时开着2个大索引,即便只有一瞬间也有出问题的可能性。

之后我找到了另一个方案,就是自己封装IndexReader,在里面加一个类似回收站的缓存。增量索引分硬盘索引和内存索引两部分,内存索引更新了文档可以立刻重新打开并生效,硬盘索引里相同ID的旧数据则放进回收站,从硬盘索引的reader中读数据时,跳过回收站中的条目。然后在合并索引的时候再做正式的删除操作。

想和大家讨论一下,有没有更简单的方案?比如,lucene本身有没有办法不重新打开整个索引而让修改生效?
lishiyaowanmei 2013-12-04
   
//IndexReader newReader = reader.reopen();                 //老版本3.x 
IndexReader newReader = DirectoryReader.openIfChanged(reader,writer,true);   
osborn 2013-12-04
原来如此,感谢!我去试试效率如何
comeonbabye 2015-09-04
现在都用solr cloud了
Global site tag (gtag.js) - Google Analytics