zoukankan      html  css  js  c++  java
  • 修改 HighLight.net 2.0 版本一处Bug

    修改 HighLight.net 2.0 版本一处Bug

    作者:肖波
         最近我的博客中有两位网友在使用 KTDictSeg 1.3 + lucene.net 2.0 + HighLight.net 2.0 是出现问题,高度怀疑是HighLight.net 2.0 版本的Bug,
    今天腾出时间把几个组件的源码全部下下来,调试了一把,终于找到了这个Bug,下面把Bug的具体原因和修改后的源码发上来,供大家参考。另外哪位网友
    知道如何向 lucene apache 组织 申报Bug,麻烦告知一声,以便我将这个Bug提交给该组织,让它的后续版本可以改进这个错误。

        错误信息:(网友 z86362780 发现)
        异常详细信息: System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。
        参数名: length

        行 131: Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer analyzer = new Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer();
        行 132: TokenStream tokenStream = analyzer.TokenStream("indexcontent", new StringReader(content));
        行 133: myrow[4] = highlighter.GetBestFragment(tokenStream, content); <---这一句报错了
        行 134:
        行 135: mytab.Rows.Add(myrow);

        我调试代码后发现错误出在 Highlighter.cs 这个文件的第263行 GetBestTextFragments 这个函数中,注Highlight.net 的版本号是 2.0.0.001, 下载位置
        原始版本故障部分代码如下:
       
     1                 if (tokenGroup.numTokens > 0)
     2                 {
     3                     //flush the accumulated text (same code as in above loop)
     4                     startOffset = tokenGroup.startOffset;
     5                     endOffset = tokenGroup.endOffset;
     6                     tokenText = text.Substring(startOffset, (endOffset) - (startOffset));
     7                     System.String markedUpText = formatter.HighlightTerm(encoder.EncodeText(tokenText), tokenGroup);
     8                     //store any whitespace etc from between this and last group
     9                     if (startOffset > lastEndOffset)
    10                         newText.Append(encoder.EncodeText(text.Substring(lastEndOffset, (startOffset) - (lastEndOffset))));
    11                     newText.Append(markedUpText);
    12                     lastEndOffset = endOffset;
    13                 }

    错误出在第6行: tokenText = text.Substring(startOffset, (endOffset) - (startOffset));
    当endOffset >= text.Length 时就会出现上述错误。这个错误并非每次都会出现,只有在搜索条件和文本信息处于某些特殊情况下才会出现,具体什么情况下会出现这个错误,我没有仔细研究。出现错误时,通常是endOffset 的值等于 text.Length.

    找到错误后,我进行了如下修改:
     1                 if (tokenGroup.numTokens > 0)
     2                 {
     3                     //flush the accumulated text (same code as in above loop)
     4                     startOffset = tokenGroup.startOffset;
     5                     endOffset = tokenGroup.endOffset;
     6                     
     7                     //The original version did not judged the endOffset < text.Length.
     8                     //It will throw a exception when endOffset >= text.Length sometimes.
     9                     //Xiao Bo fix this bug at 2008-07-09
    10                     if (endOffset < text.Length)
    11                     {
    12                         tokenText = text.Substring(startOffset, (endOffset) - (startOffset));
    13                         System.String markedUpText = formatter.HighlightTerm(encoder.EncodeText(tokenText), tokenGroup);
    14                         //store any whitespace etc from between this and last group
    15                         if (startOffset > lastEndOffset)
    16                             newText.Append(encoder.EncodeText(text.Substring(lastEndOffset, (startOffset) - (lastEndOffset))));
    17                         newText.Append(markedUpText);
    18                     }
    19                      
    20                     lastEndOffset = endOffset;
    21                 }

    修改后再运行,故障排除。

    我修改后的版本的完整代码和编译好的库的下载位置 HighLight2.0.0.002-XiaoBo
    我将版本号设置为2.0.0.002以便和原始版本的区别,这个只是一个临时版本,等故障上报给lucene apache 组织 后,
    等该组织修改了其正式版本,这个版本就可以退休了。



  • 相关阅读:
    vscode源码编译疑难问题
    vscode安装依赖报错 TypeError: zipfile.readEntry is not a function
    mysql中对比 JSON_VALUE 与 JSON_QUERY
    读过的书(持续更新)
    工作小技巧20181101
    hive里面union all的用法记录
    算法图解读书笔记:附程序
    深入浅出统计学读书笔记:离散概率分布的应用
    常见机器学习算法优缺点
    利用python进行数据分析--pandas入门2
  • 原文地址:https://www.cnblogs.com/eaglet/p/1238635.html
Copyright © 2011-2022 走看看