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取倒数,
相关文章
相关标签/搜索