solr排序问题
搜搜引擎排序问题,因为涉及到的维度比较多,有时候单纯的依靠sort是无法满足需要的,例如:搜索商品的时候我希望不管怎么排无货的商品都置底,这样问题就来了,怎么排?
其实,solr是自己的解决方案的,比如: dismax、edismax两种支持函数查询,关于solr函数查询更多的信息,看这里。
因为工作的需要,需要对搜索做排序,这里我记录下我的处理方法,搜索的商品要把无货的置底,但是还要能按别的字段排序,例如价格,不管价格升序还是降序,无货的商品都要置底,我的处理方法是:
价格降序时:defType=edismax&bf=sum(price,map(map(stock,0,0,-100000),1,maxStockValue,1)),stock:是索引的库存字段,price:是索引的价格字段,solr的排序继承lucene的默认倒排序,map(stock,0,0,-100000),的意思是,当stock>=0 并且 stock<=0时返回-100000,当stock大于0时,就返回stock本身的值;而第二层map,使得stock的值处在[1,maxStockValue]闭区间时,就会返回1,否则就会返回第一层的-100000,之所以这么做,就是为了保证如果stock的值是0,那么它的boost分值就会拉到很低,如果stock不是0,它的影响因子也很小,不至于影响到前边字段的排序值。
价格升序时:sum(product(recip(sum(price,100),1,1,0),100000),map(map(stock,0,0,-100000),1,maxStockValue,1)),因为lucene使用的倒排序索引,所以这里如果想实现价格升序,就是取倒数,recip(sum(price,100),1,1,0),
recip用法:
recip(x,m,a,b)=a/(m*x+b)其中,m、a、b是常量,x是变量或者一个函数。
当a=b,并且x>=0的时候,这个函数的最大值是1,值的大小随着x的增大而减小。
例如:recip(rord(creationDate),1,1000,1000)
这里没有直接用price取倒数,是因为有时候为了活动的需要商品的价格会调成¥0,所以,此时就会有问题;所以这里对所有价格加100取倒数,