Lucene.Net浅谈三(搜索结果排序)

 有点晕了,毕业这么久,才后悔当初应该学计算机专业的;也后悔没专业的学习过就进入这个行业。有些基础性的东西,还是差远了。

在前一篇文章中,我说到了Lucene.Net的搜索结果排序问题。当时,我的想法是将DateTime 转换成float 去进行排序;初一看似乎没什么问题,想法也很好。可是最近测试人员老是报告说:排序很乱,不是按照他们的时间来排的。我就奇怪了。

仔细检查,原来是float的精度问题造成的,float精度 7位。具个例子:

float  f1  =   20080421153700 ;           
            
float  f2  =   20080421094827 ;

            
if  (f1  >  f2)
            
{
                MessageBox.Show(
"正确");
            }

            
else   if  (f1  ==  f2)
            
{
                MessageBox.Show(
"相等");
            }

            
else
            
{
                MessageBox.Show(
"错误");
            }

上面这段代码,输出结果是什么呢? 我们一看,很显然f1 要比f2大,我们希望的结果是“正确”,可是输出的结果却是“相等”,为什么?由于float的精度是7位,它们比较的从高到低的前七位,f1 和 f2 的前7位都是"2008042",结果就相等了。

郁闷了,这样,我们的结果排序就有问题了。转换成int又会溢出。难道没有解决办法了吗?

我们还是从DateTime 和 int 类型来入手。

/// <summary>
        
/// 将时间转换成一个Int类型的数字
        
/// </summary>
        
/// <param name="dt"></param>
        
/// <returns></returns>

         private   int  ConvertDateTimeToInt(DateTime dt) 
            TimeSpan ts
=dt.Subtract(DateTime.MinValue);
            
return (int)ts.TotalMinutes;
        }

由于直接将时间转换成int会溢出,因此我们在每个时间的基础上都减去一个基数(DateTime.MinValue);这个基数可以根据自己的时间情况去设置。比如我们也可设置成2008-01-01 00:00:01

这样转换以后,我们的时间实际是精确到“分”,这基本满足我们的要求了。如果我们希望精确到“秒”,那么我们只需要将这个基数设置大一些,也就是离我们进一些的时间。

最后排序时:

Sort sort  =   new  Sort( new  SortField( " Time " 4 true ));

 

我们的排序问题,就解决了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值