关于Lucene.Net 2.3.1 索引时抛出System.IndexOutOfRangeException异常

一、异常情形

IndexWriter writer  =   new  IndexWriter( " D:\\index " new  StandardAnalyzer(), true );
writer.SetMaxBufferedDocs(
1000000 );
writer.SetMergeFactor(
1000 );
for  ( int  i  =   0 ; i  <   1000000 ; i ++ ) {
    AddDocument(writer, 
" 测试标题 " " 测试内容 " );
}

static   void  AddDocument(IndexWriter writer,  string  title,  string  content) {
    Document document 
=   new  Document();
    document.Add(
new  Field( " title " , title, Field.Store.YES, Field.Index.TOKENIZED));
    document.Add(
new  Field( " content " , content, Field.Store.YES, Field.Index.TOKENIZED));
    writer.AddDocument(document);
}

使用以上代码进行索引时会抛出“System.IndexOutOfRangeException,索引超出了数组界限。”异常。抛出异常的代码在DocumentWriter 3543行左右。

int  level  =  slice[upto]  &   15 ;
int  newLevel  =  Lucene.Net.Index.DocumentsWriter.nextLevelArray[level];
int  newSize  =  Lucene.Net.Index.DocumentsWriter.levelSizeArray[newLevel];
int newLevel = Lucene.Net.Index.DocumentsWriter.nextLevelArray[level];语句nextLevelArray数组的索引有效范围是0~9,当出现10以上时会报该错误。详细原因还未找出,据我推测这是从Java版本翻译过来造成的情况。
这里的slice参数传递进来时byte类型的数组,从数组中取值,取出的值范围在0~255,和15做与运算,还是能够大于9。这是Java与.net的差异造成的。Java中的byte范围是-128~127,也就是说Java中的byte类型是有符号的,而.net中的byte类型是无符号的。java中的byte应该与.net中的sbyte相对应。Java代码原本限制出现该错误的逻辑,移植到.net版本可能会无效。这里就造成了引发这个异常的原因。
以上属个人推测。
二、解决办法
暂时没有太好的办法能够解决这个问题。
1、在Lucene 2.4版本中DocumentWriter已经进行了大改造,再翻译过来可能不会有这种问题。但是等.net版本更新到那个版本估计还要很长时间。
2、还有就是把现在使用的2.3.1版降低到2.1版。
3、经实验表明,writer.SetMaxBufferedDocs(1000000);这个数字小于10000时,也不会引发这个错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值