摘要: 函数查询允许你使用一个或多个数字字段的真实值生成一个相关性分数,函数查询在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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-08-10 N卡控制面板把physx设置为cpu