eaglet

本博专注于基于微软技术的搜索相关技术
随笔 - 189, 文章 - 0, 评论 - 3725, 阅读 - 147万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

修改 HighLight.net 2.0 版本一处Bug

Posted on   eaglet  阅读(2530)  评论(11编辑  收藏  举报
修改 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 组织 后,
等该组织修改了其正式版本,这个版本就可以退休了。



编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2007-07-09 一款轻量级的桌面应用和Web Server 通讯组件
点击右上角即可分享
微信分享提示