基于Lucene 2.1的研究:Lucene.Net版本Bug修改

基于Lucene 2.1的研究:Lucene.Net版本Bug修改

      Lucene.Net 2.1版本还没有正式发布,但可以从SVN中下载获得。在此版本中,当对Java版本建立的索引文档进行搜索时,会有异常抛出。经过我调试和对比,发现是因为Java中Long.parseLong(String s,int radix),Long.toString(long i,int radix)与.Net中的Convert.ToInt64(String,int32),Convert.ToString(int64,int32)是不同的。具体差异请查找相关文档,下面我只给出解决方案。
      在Lucene.Net 2.1工程中的SupportClass.cs中添加如下代码:

       //实现Java的Long.parseLong(String s,int radix)

         public static Int64 ConvertToInt64(string s, int fromBase)
         {
              Int64 result = 0;

              for (int i = (s.Length-1),j=0; i >=0; i--,j++)
              {
                  char ch = char.ToLower(s[i]);

                  int v = char.IsDigit(ch)==true?int.Parse(ch.ToString()):(10+(int)(ch-'a'));

                  result = result + Convert.ToInt64(v * Math.Pow(fromBase, j));
              }

              return result;
          }


      //实现Java的Long.toString(long i,int radix)
      
      public static string ConvertToString(long l, int fromBase)
      {
              int maxP =(int) Math.Floor(Math.Log(l,fromBase));
              int maxN = (int)Math.Floor(l / Math.Pow(fromBase, maxP));

              char[] chs = new char[maxP+1];

              chs[0] = (maxN >= 0 && maxN <= 9) ? char.Parse(maxN.ToString()) : (char)((int)('a')+(maxN - 10));

              long n1 = (long)(l - maxN*Math.Pow(fromBase, maxP));
              long temp=n1;

              for (int i = (maxP-1),j=1; i >= 0;i--,j++)
              {
                  int n2 = (int)Math.Floor(temp/Math.Pow(fromBase,i));

                  chs[j]=(n2>=0 && n2<=9)?char.Parse(n2.ToString()):(char)((int)('a')+(n2-10));

                  temp=(long)(temp-n2*Math.Pow(fromBase,i));
              }

              return new string(chs);
          }

       这样替换Lucene.Net中的相关代码,就可以了。而且经过测试,发现.Net版本的查询速度比Java版本的快很多,很搞不清楚。

你可能感兴趣的:(基于Lucene 2.1的研究:Lucene.Net版本Bug修改)