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取倒數,
相關文章
相關標籤/搜索