修改 lucene Highlighter.net 2.0 版本一处Bug

 修改 HighLight.net 2.0 版本一处Bug

作者:肖波
     最近我的博客中有两位网友在使用 KTDictSeg 1.3 + lucene.net 2.0 + HighLighter.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 组织 后,
等该组织修改了其正式版本,这个版本就可以退休了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值