sunspot+solr検索のカスタムソート

2571 ワード

最近、システムが個性的なソート検索結果を必要とするため、solrのソートを研究したところ、solrはソート中に関数を使用してフィールドを処理することをサポートしていることが分かった.以前は注目していなかったため、このような良い機能を逃したが、実はsolrは早起きしていくつかの関数の機能をサポートしていたが、その後、ますます多くの関数が増加している.詳細はここを参照してください.
sunspotでサポートされているソートで関数を使用するのは2013年末になってからサポートされています.もちろん、その前にカスタムパラメータの形式でクエリーすることができますが、このsunspotのサポートがあればもっと便利です.
長いこと言ってたけど実はsunspotを使ってるorder_by_function関数がこの関数をソートする最初のパラメータは関数名で、最後のパラメータはソート方式で、真ん中はsolr関数が使用するパラメータで、order_by_funtionは関数のネストもサポートしています
#   ,          2014-4-1~2014-4-30         
#               ,      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で使用可能な関数の説明abs(x)が絶対値abs(-5)「constant」を返して浮動小数点数1.5 def(「field」,value)のデフォルト値を指定し、指定フィールドが存在しない場合、デフォルト値def(ration,5)div(x,y)除算を返し、xをy div(1,5)distで割って2点間の距離dis(2,x,y,0)docfreq(field,val)を計算するある値がフィールドに出現した回数docfreq(title,’solr’)field("field")を返し、ある値がフィールドに出現した回数docfreq(title,’solr’)を返し、ある値がフィールドに出現した回数docfreq(field(‘title’)hsin曲面円弧上の2点間の距離hsin(2,true,x,y,0,0)idf Inverse document frequency逆組み文書周波数idf("field",’solr’)hsin(test,value 1,value 2)if(termfreq(title,’solr’),popularity)ifif(test,,42)linear(x,m,c)はmx+cであり、sum(product(m,x),c)linear(1,2,4)=1 x 2+4=6 log(x)が10をベースとし、xの対数log(sum(x,100))map(x,min,max,target)xがminとmaxの間にある場合、x=target、そうでなければx=x map(x,0,0,0,0,1)max(x,y,…)は最大値max(2,3,0)maxdocがインデックスの個数を返し、削除状態とマークされたドキュメントを含むドキュメントがどれだけあるかを調べ、削除状態とマークされたドキュメントを含むドキュメントがどれだけあるかを調べる.maxdoc()min(x,y,...)最小値min(2,4,0)msは、2つのパラメータ間のミリ秒レベルの差ms(datefield 12000-01-01 T 00:00:00 Z)norm(field)は、このフィールドのインデックス値のノルムnorm(title)numdocsがインデックスの個数を返し、削除ステータスとマークされたドキュメントnumdocs()ordを含まないドキュメントを表示し、順序インデックスに従って出荷結果ord(title)pow(x,y)を出荷するxを返すy次方pow(x,log(y))product(x,y)は、複数の積に値するproduct(x,2)queryを返し、所与のサブクエリのスコアを返すか、ドキュメントが一致しないデフォルト値query(subquery,default)recip(x,m,a,b)はa/(mx+b)に相当し、a,m,bは定数であり、xは変数recip(myfield,m,a,b)であるrordはordの結果に従って逆順にscaleを返し、最大値と最小値の間の値scale(x,1,3)sqedist平方オーステナイト距離計算sqedist(x_td,y_td,0,0)sqrt戻り指定値平方根sqrt(x)sqrt(100)strdist計算2文字列間の距離strdist(「SOLR」,id,edit)sub戻りx-y sub(field 1,field 2)sum(x,y)戻り指定値の和sum(x,y,...)sumtotaltermfreqは、すべてのtotaltermfreqの和termfreq語が出現した回数termfreq(title,’sorl’)tf語周波数tf(text,’solr’)top機能を返し、ord totaltermfreqがこのフィールドに出現した回数ttf(title,’memory’)を返し、true値を返し、そのすべての操作がtrue and(not(exists(popularity),exists(price))である場合にのみ返す.or true値を返すtrue or(value 1,value 2)xorがfalse値を返すすべての操作が真xor(field 1,field 2)not除外操作not(exists(title))existsフィールドが存在する場合真exists(title)gt,gte,lt,lte,eq比比較関数2 gt 1を返す