摘要: 函數查詢允許你使用一個或多個數字字段的真實值生成一個相關性分數,函數查詢在standard,DisMax,eDisMax下都能使用。
查詢函數可以是常量,字段或者其他函數的組合。使用函數可以影響結果的排序。本文整理自Solr官方文檔:https://lucene.apache.org/solr/guide/6_6/function-queries.html
使用Function Query
1.直接向QParser指定函數參數,如func或frange:
q={!func}div{popularity,price}&fq={!frange l=1000}cus
tomer_ratings
2.在排序時使用:
sort=div(popularity,price)desc,score desc
3.在查詢結果中預處理一些輸出字段
&fl=sum(x,y),id,a,b,c,score
4.指定函數的一個參數:在dDisMax中指定boost參數,在DisMax中指定bf參數
q=dismax&bf=”ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3”
5.在Lucene的QParser中使用_val_關鍵字指定函數:
q=_val_:mynumericfield _val_:”recip(rord(myfield),1,2,3)”
Solr中的可用函數
| 函數 | 說明 | 舉例 |
|---|---|---|
| abs(x) | 返回絕對值 | abs(-5) |
| “constant” | 指定一個浮點數 | 1.5 |
| def(“field”,value) | 默認值,當指定字段不存在時,返回默認值 | def(rationg,5) |
| div(x,y) | 除法,x除以y | div(1,5) |
| dist | 計算兩點之間的距離 | dis(2,x,y,0,0) |
| docfreq(field,val) | 返回某值在某字段出現的次數 | docfreq(title,’solr’) |
| field(“field”) | 返回該field的索引數量 | field(‘title’) |
| hsin | 曲面圓弧上兩點之間的距離 | 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) | 就是m*x+c,等同於sum(product(m,x),c) | linear(1,2,4)=1x2+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,1) |
| max(x,y,…) | 返回最大值 | max(2,3,0) |
| maxdoc | 返回索引的個數,查看有多少文檔,包括被標記為刪除狀態的文檔 | maxdoc() |
| min(x,y,…) | 返回最小值 | min(2,4,0) |
| ms | 返回兩個參數間毫秒級的差別 | ms(datefield1,2000-01-01T00:00:00Z) |
| 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/(m*x+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 | 計算兩個字符串之間的距離 | strdist(“SOLR”,id,edit) |
| sub | 返回x-y | sub(field1,field2) |
| sum(x,y) | 返回指定值的和 | sum(x,y,…) |
| sumtotaltermfreq | 返回所有totaltermfreq的和 | |
| termfreq | 詞出現的次數 | termfreq(title,’sorl’) |
| tf | 詞頻 | tf(text,’solr’) |
| top | 功能類似於ord | |
| totaltermfreq | 返回這個詞在該字段出現的次數 | ttf(title,’memory’) |
| and | 返回true值當且僅當它的所有操作為true | and(not(exists(popularity)),exists(price)) |
| or | 返回true值當有一個操作為true | or(value1,value2) |
| xor | 返回false值如果所有操作都為真 | xor(field1,field2) |
| not | 排除操作 | not(exists(title)) |
| exists | 如果字段存在返回真 | exists(title) |
| gt,gte,lt,lte,eq | 比較函數 | 2 gt 1 |
