solr map函数的坑

来源:互联网 发布:手机域名注册查询 编辑:程序博客网 时间:2024/06/13 12:25


在solr中有很很多的函数查询,比如 sum,product,div等等,这里主要跟大家讲下这个map以及我在使用过程中遇到的一个坑。

在solr查询中我相信大家一定会碰到一个动态加权排序的问题,这时候map其实是一个很好的选择。map函数的原型如下:

1.map,如果 min<=x<=max,那么map(x,min,max,target)=target,如果 x不在[min,max]这个区间内,那么map(x,min,max,target)=x.

2.map,如果 min<=x<=max,那么map(x,min,max,target,other)=target,如果 x不在[min,max]这个区间内,那么map(x,min,max,target,other)=other.

map有上面两种方式,我这里主要就是用这个map做了一个商品的分类动态加权分。

刚开始时分类很少并没有出现什么问题。但是随着系统的发展,分类Id很大,大约到了209999999这样的值,这时候我发现用map时并没有出现加权的效果,当时纠结了我很久,最后还是查到了问题。大家在用这个map时很多人以为 min 和 max是int型,其实在solr里面它是一个float型,使用debugQuery时你就可以看出。然后问题来了,当我们的数值很大的时候 使用这个float就会出现整数位和精度丢失的问题,比如

 Float float1 = Float.parseFloat("200999999");
        System.out.println(float1);

大家运行下就可以知道了。

其实我也有点没想通solr为啥要使用float而不是double,如果使用double 的话就不会出现这个问题。