lucene索引坏掉原因之浅析
突然想起很久以前一个让人看得无奈的一个电视广告了,画面上一个女人念的台词大概是:轮胎坏了很倒霉,但更倒霉的是那几天。。。然后某种女性专用的产品就闪亮登场了。对lucene使用者而言,最倒霉的不是轮胎坏了,也不是某几天XXX了。。。而是好不容易建立起来的索引突然一下子坏掉了,又得辛辛苦苦地重新创建!
对于lucene索引坏掉的现象我也碰到过,所以在这里我对这个现象做个浅析,也就是做个参考吧,希望有助于减少这种现象的发生。
我们知道,在lucene中对索引进行操作时,必须要遵循这样的规则(参见Lucene In Action):
1、 IndexReader对象在从索引中删除一个文档时,IndexWriter对象不能向其中添加文档。
2、 IndexWriter对象在对索引进行优化时,IndexReader对象不能从其中删除文档。
3、 IndexWriter对象在对索引进行合并时,IndexReader对象也不能从其中删除文档。
以上的几条也算是老生常谈了,事实上,在实际的应用中,也很少有人会违反以上的规则,但问题是索引坏掉的现象还是出现了,这才是让人感觉郁闷的地方。
我原来搭建过lucene搜索引擎的测试系统,当时那个服务器空间是免费的,所以配置也很低,也碰到过了索引坏掉这一现象,而且还不是一次两次,那时总是去检查程序,但确认程序是没问题的,后来甚至于我都怀疑是lucene本身的bug了(我用的是lucene2.2.0)。
对于这个现象,我认为的其他可能的原因是:
4、与服务器的配置有关,也就是服务器配置相对系统而言过低而导致的。这个原因也似乎可以从lucene(3.0.0)的IndexWriter类中关于optimize()的说明中得到一些验证,关于optimize()的一些说明如下(翻译):
4.1、注意:当使用optimize的时候,磁盘空间必须要有当前索引大小2倍的空间。比如,如果你当前索引大小是10M,那么你应该有20M空闲的磁盘空间以供optimize顺利完成。(注:所以假如服务器配置很低,当索引建到一定大小的时候,这个时候磁盘空间已经不够了,而且还是继续创建着的话?)
4.2、如果在optimize的过程中出了错,比如因为磁盘空间满了的原因,索引不会坏掉,索引中的文档也不会丢失,但很可能的是,当前仅仅是完成了部分优化,也就是有的段合并了,但有的段没有,还可能的是有些段不是压缩格式,即使采用了压缩格式,也就是在程序中显示调用writer.setUseCompoundFile(true);(注:虽然lucene的API说明说索引不会坏掉,索引中的文档也不会丢失,但我个人非常怀疑这点,因为这个时候的索引已经很混乱了!)
4.3、如果在optimize的过程中抛出了OutOfMemoryError,应该马上关掉IndexWriter。(注:服务器配置低,往往内存空间也很低,假如出现这个错误了但IndexWriter没有关掉的话?)
以上只是对索引坏掉现象的一个浅析,欢迎对此了解的朋友补充、指教。
如无转载说明,则均为本站原创文章,转载请注明:来源:子猴博客
