Lucene.Net 2.1版本還沒(méi)有正式發(fā)布,但可以從SVN中下載獲得。在此版本中,當(dāng)對(duì)Java版本建立的索引文檔進(jìn)行搜索時(shí),會(huì)有異常拋出。經(jīng)過(guò)我調(diào)試和對(duì)比,發(fā)現(xiàn)是因?yàn)镴ava中Long.parseLong(String s,int radix),Long.toString(long i,int radix)與.Net中的Convert.ToInt64(String,int32),Convert.ToString(int64,int32)是不同的。具體差異請(qǐng)查找相關(guān)文檔,下面我只給出解決方案。
在Lucene.Net 2.1工程中的SupportClass.cs中添加如下代碼:
//實(shí)現(xiàn)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;
}
//實(shí)現(xiàn)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中的相關(guān)代碼,就可以了。而且經(jīng)過(guò)測(cè)試,發(fā)現(xiàn).Net版本的查詢速度比Java版本的快很多,很搞不清楚。
posted on 2007-05-15 17:16
Terry Liang 閱讀(1975)
評(píng)論(6) 編輯 收藏 所屬分類:
Lucene 2.1研究