近來由于系統(tǒng)需要個(gè)性化的排序搜索結(jié)果,所以研究了一下solr的排序,發(fā)現(xiàn)solr支持在排序中使用函數(shù)對字段進(jìn)行處理,以前由于沒有關(guān)注導(dǎo)致錯(cuò)過了這么好的功能,其實(shí)solr早起就支持一些函數(shù)的功能,后來增加了越來越多的函數(shù),詳情參見這里
sunspot中支持排序中使用函數(shù)是到2013年底才開始支持的,當(dāng)然在這之前可以使用自定義參數(shù)的形式來查詢,不過有這個(gè)sunspot的支持就更方便了
說了半天其實(shí)就是使用sunspot的order_by_function函數(shù)來排序
這個(gè)函數(shù)的第一個(gè)參數(shù)是函數(shù)名稱,最后一個(gè)參數(shù)是排序方式,中間是solr函數(shù)使用的參數(shù),order_by_funtion還支持函數(shù)的嵌套
#上代碼,以下排序是將時(shí)間在 2014-4-1~2014-4-30中間的數(shù)據(jù)排到前面
#其他時(shí)間的排到這個(gè)時(shí)間段的后面,即便時(shí)間是 2015年也和2012年一樣排到后面
Post.search do
order_by_function(:map,:price_date,'2014-4-1'.to_time.to_i*1000,'2014-4-30'.to_time.to_i*1000,1,0,:desc)
end
Solr中的可用函數(shù)
函數(shù) 說明 舉例
abs(x) 返回絕對值 abs(-5)
“constant” 指定一個(gè)浮點(diǎn)數(shù) 1.5
def(“field”,value) 默認(rèn)值藐唠,當(dāng)指定字段不存在時(shí),返回默認(rèn)值 def(rationg,5)
div(x,y) 除法鹉究,x除以y div(1,5)
dist 計(jì)算兩點(diǎn)之間的距離 dis(2,x,y,0,0)
docfreq(field,val) 返回某值在某字段出現(xiàn)的次數(shù) docfreq(title,’solr’)
field(“field”) 返回該field的索引數(shù)量 field(‘title’)
hsin 曲面圓弧上兩點(diǎn)之間的距離 hsin(2,true,x,y,0,0)
idf Inverse document frequency 倒排文檔頻率 idf(“field”,’solr’)
if if(test,value1,value2) if(termfreq(title,’solr’),popularity,42)
linear(x,m,c) 就是mx+c,等同于sum(product(m,x),c) linear(1,2,4)=1x2+4=6
log(x) 以10為底宇立,x的對數(shù) log(sum(x,100))
map(x,min,max,target) 如果x在min和max之間,x=target,否則x=x map(x,0,0,1)
max(x,y,…) 返回最大值 max(2,3,0)
maxdoc 返回索引的個(gè)數(shù),查看有多少文檔自赔,包括被標(biāo)記為刪除狀態(tài)的文檔 maxdoc()
min(x,y,…) 返回最小值 min(2,4,0)
ms 返回兩個(gè)參數(shù)間毫秒級(jí)的差別 ms(datefield1,2000-01-01T00:00:00Z)
norm(field) 返回該字段索引值的范數(shù) norm(title)
numdocs 返回索引的個(gè)數(shù)妈嘹,查看有多少文檔,不包括被標(biāo)記為刪除狀態(tài)的文檔 numdocs()
ord 根據(jù)順序索引發(fā)貨結(jié)果 ord(title)
pow(x,y) 返回x的y次方 pow(x,log(y))
product(x,y) 返回多個(gè)值得乘積 product(x,2)
query 返回給定的子查詢的得分绍妨,或者文檔不匹配的默認(rèn)值值 query(subquery,default)
recip(x,m,a,b) 相當(dāng)于a/(mx+b),a,m,b是常量润脸,x是變量 recip(myfield,m,a,b)
rord 按ord的結(jié)果反序返回
scale 返回一個(gè)在最大值和最小值之間的值 scale(x,1,3)
sqedist 平方歐氏距離計(jì)算 sqedist(x_td,y_td,0,0)
sqrt 返回指定值得平方根 sqrt(x)sqrt(100)
strdist 計(jì)算兩個(gè)字符串之間的距離 strdist(“SOLR”,id,edit)
sub 返回x-y sub(field1,field2)
sum(x,y) 返回指定值的和 sum(x,y,…)
sumtotaltermfreq 返回所有totaltermfreq的和
termfreq 詞出現(xiàn)的次數(shù) termfreq(title,’sorl’)
tf 詞頻 tf(text,’solr’)
top 功能類似于ord
totaltermfreq 返回這個(gè)詞在該字段出現(xiàn)的次數(shù) ttf(title,’memory’)
and 返回true值當(dāng)且僅當(dāng)它的所有操作為true and(not(exists(popularity)),exists(price))
or 返回true值當(dāng)有一個(gè)操作為true or(value1,value2)
xor 返回false值如果所有操作都為真 xor(field1,field2)
not 排除操作 not(exists(title))
exists 如果字段存在返回真 exists(title)
gt,gte,lt,lte,eq 比較函數(shù) 2 gt 1