=波波日志 > lucene.net/分词技术 > 关于Lucene.Net 2.3.1 索引时抛出System.IndexOutOfRangeException异常=
[转]关于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);
}
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];
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时,也不会引发这个错误。
http://www.cnblogs.com/birdshover/archive/2009/02/16/1391453.html
http://www.cnblogs.com/birdshover/archive/2009/02/16/1391453.html
从svn上重新下一个,已经解决这个问题了。
当时也发现这个问题,后来下载了一个补丁解决。
现在的最新版已经没问题了
现在的最新版已经没问题了
类别:lucene.net/分词技术 作者:转载 日期:2009-09-01 【评论:0】
暂时没有评论!
发表留言
百度赞助
同类热门博文
- ·lucene中文分词器--..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·中文分词算法
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·lucene.net 2.0 中文..
博格Tag
- flash/flex/fcs/AIR(752)
- Asp.Net/C#/WCF(598)
- 操作系统及应用软件(376)
- JavaScript/Ajax(330)
- SQL及数据库(134)
- 黑客技术(115)
- Asp/VBScript(111)
- HTML/WML/CSS兼容/XML(102)
- PHP/apache/Perl(96)
- 网站排名及优化(96)
- 其他(75)
- showbo日志(66)
- lucene.net/分词技术(33)
- 计算机网络(26)
- 机械重工(26)
- C#设计模式(25)
- Google Maps开发(17)
- 日语学习(15)
- Canvas/VML/SVG(13)
- linux(11)
- 游戏开发(8)
- 正则表达式(5)
- Jsp/Java(4)
最新博文
- ·Lucene.Net实现Grou..
- ·Lucene.Net 按类别统..
- ·《Lucene天书》 Luc..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
- ·Lucene.Net 2.3.1开..
随机博文
