zoukankan      html  css  js  c++  java
  • 关于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时,也不会引发这个错误。
  • 相关阅读:
    Bootstrap表单验证插件bootstrapValidator使用方法整理
    bootStrap树形目录组件
    根据对象的某一属性进行排序的js代码(如:name,age)
    Ajax跨域:jsonp还是CORS
    用border-image实现波浪边框
    Ajax加载菊花loding效果
    写一个js向左滑动删除 交互特效的插件——Html5 touchmove
    js抛物线动画——加入购物车动效
    zepto弹出层组件
    原生JS实现购物车结算功能代码+zepto版
  • 原文地址:https://www.cnblogs.com/birdshover/p/1391453.html
Copyright © 2011-2022 走看看