lucene索引坏掉原因之浅析

2009年12月23日 | 分类: 技术 | 标签: , 3,309浏览 | By admin

突然想起很久以前一个让人看得无奈的一个电视广告了,画面上一个女人念的台词大概是:轮胎坏了很倒霉,但更倒霉的是那几天。。。然后某种女性专用的产品就闪亮登场了。对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没有关掉的话?

以上只是对索引坏掉现象的一个浅析,欢迎对此了解的朋友补充、指教。

如无转载说明,则均为本站原创文章,转载请注明:来源:子猴博客

相关内容

目前还没有任何评论.
*

酷!左边勾选上复选框,评论里将显示你博客文章!
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!:

Upload Files

你可以上传一张或多张图片,这些图片将附在你评论里