DotLucene 之 Bugs 小记[转]

最近由于工作需要,正在啃 DotLucene 的源码……呼……七个目录兮……四万行…… 

不过关于 Lucene 这个东东的研究与褒奖已经有好多好多,所以偶决定先写点实用的,以方便人民大众。
 
—— 用 DotLucene 做项目不能不 De 的 Bugs 集合:

(以 DotLucene 1.9 RC1 Build 002 alpha 为准,目前发现 Bug 三条)

第一条:

位置:Document\DateField.cs 75 行 | 120行

重要度:0.1

描述:其实不能算 Bug …… 因为注释里已经写得明明白白:查询日期不能早于1970-1-1  否则抛出异常。

原因:想破头也没有想明白为什么,难道是因为36岁以后还在当程序员的人太少。。。

解决方案:把上述位置 1970 改成 1900 or so . KO.

第二条:

位置:Document\DateField.cs 52 行

重要度:0.2

描述:

此前的版本都可以正常工作,因为使用的是自定义的 "itoa" 方法。(SupportClass.Number.MAX_RADIX = = 36)

private static int DATE_LEN = SupportClass.Number.ToString( 
            1000L * 365 * 24 * 60 * 60 * 1000, SupportClass.Number.MAX_RADIX ).Length;

最新版本居然改成了这样:

private static int DATE_LEN =
        System.Convert.ToString( 1000L * 365 * 24 * 60 * 60 * 100036 ).Length;

而以上方法并不接受 2,8,10,16 以外的基数,所以只要创建了 DateField 类的实例就会抛出异常。

原因:也许创建这个版本的家伙当天睡眠不太充足……

解决方案:改回原来版本的实现。

第三条:

位置:Index\SegementTermVector.cs 83 行

重要度:1000

描述与原因:
SegementTermVector.IndexOf  方法通过 Term 的 Text 进行二分查找得到该 Term 的 Index,从而在TermPositionVector 等数组中获取相应的数据(例如需要确定 Term 在数据源中的出现顺序时就会用到)。然而地球人都知道应用二分查找的前提是数组有序,上述位置中数组 terms 的顺序是倒排索引中 Term 的顺序,也就是String.CompareOrdinal 方法的顺序,而 Array.BinarySearch(Array,object) 方法使用的是 String.Compare 方法来进行比较 。举例来说:按默认实现方法,在 TermText 数组 {"C#","atom","basic","cat","dog","edge","fly"} 中二分查找 "C#" 是找不到任何结果的,对于中文的 TermText 也有类似问题。

解决方案:实现使用 String.CompareOrdinal 方法进行比较的 IComparer ,并使用带有 IComparer 参数的 Array.BinarySearch 方法重载版本进行查找。

注:Search.QueryTermVector 中不存在此问题,因为在 Search\QueryTermVector.cs  78 行 terms 已经事先使用 Array.Sort 方法排序,此顺序与 String.Compare 方法一致。

原文地址:http://www.cnblogs.com/leaphy/archive/2006/02/22/335122.html
posted @ 2008-08-21 13:23  古道轻风  阅读(250)  评论(0编辑  收藏  举报