1 . Function Queries
函数查询使你可以使用一个或者多个数字字段的实际的值生成一个关联的得分(score),函数查询支持DixMax,eDisMax,标准的查询解析.
函数查询使用函数,函数可以是常量(数字或字符文字),一个字段,另一个函数,一个替换参数的参数.也可以使用这个函数修改结果排序.
这里有三个主要的函数查询方式:
- 使用_val_关键字引入函数查询:
_val_:mynumericfield _val_:"recip(rord(myfield),1,2,3)"
- 使用具有明确函数查询类型的参数,如DisMax查询解析器的bf(boost function)参数.注意bf参数实际上使用了空格分隔的函数查询列表.
q=dismax&bf="ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3"
- 添加函数查询的结果作为一个文档的字段:
&fl=sum(x, y),id,a,b,c,score
输出结果:
... <str name="id">foo</str> <float name="sum(x,y)">40</float> <float name="score">0.343</float> ...
只有随机快速访问功能推荐使用.
1.1 abs
描述:返回指定值或者函数的绝对值
语法例子:abs(x) abs(-5)
1.2 and
描述:当且仅当它的两个操作都是true时,返回true
语法例子: and("blue","sky")
1.3 constant
描述: 指定一个浮点值常量
语法例子: 1.5 或者 _val_:1.5
1.4 def
描述:default的简称.返回字段的值,如果字段不存在时,返回指定的值;并且在 exists()==true的地方生成第一个值.
语法例子: def(rating,5) ,def(myfield, 1.0)等价于if(exists(myfield),myfield,1.0)
1.5 div
描述:除法,div(x,y):y除以x
语法例子: div(1,y) div(sum(x,100),max(y,1))
1.5 dist
描述:在n纬空间中,返回两个向量(点)之间的距离.
语法例子:
dist(2, x, y, 0, 0) :计算在向量(x,y)和(0,0)之间的欧式距离(Euclidean).
dist(1, x, y, 0, 0):计算在向量(x,y)和(0,0)之间的曼哈顿距离(Manhattan).
dist(2, x,y,z,0,0,0):计算在向量(x,y,z)和(0,0,0)之间的欧式距离(Euclidean).
dist(1,x,y,z,e,f,g):计算在向量(x,y,z)和(e,f,g)之间的曼哈顿距离(Manhattan).
1.6 docfreq(field,val)
描述:返回字段中包含这个term的文档数量.这是一个常量(对于索引中所有的文档值是一样的).如果比较复杂的话,可以用引号括住,或者对term值引用替换.
语法例子: docfreq(text,solr) docfreq(text,'solr') &defType=func&q=docfreq(text,$myterm)&myterm=solr
1.7 exists
描述:如果该字段的任何成员存在,返回true.
语法例子: exists(author):如果字段author有值的话,返回true. exists(query(price:5.00)):如果price中包含5.00的话,返回true
1.8 field
描述:返回索引中数字字段(不是多值字段)的最大的值.这个语法就是使用这个字段名称本身,如果这个字段没有值,返回一个0.
语法例子: _val_:myFloatField
1.9 hsin
描述:Haversine(半矢量,迭加正弦波). 这个Haversine距离计算在一个范围内计算两个点之间的距离,该值必须是弧度.hsin同样带有一个Boolean参数指定是否转换他的输出到弧度.
语法例子: hsin(2, true, x, y, 0, 0)
1.10 fl
描述:定义了查询响应的结果中的字段.
语法例子: fl=*,score
1.11 idf
描述:反转文档频率;一个关于term在所有文档中是否常见或者罕见的度量.通过由含有该term的文档总数除以文档总数,然后对这个商取对数.
语法例子: idf(list1,326.55) :
1.12 if
描述:
开启条件函数查询.IF(test;value1,value2):
test:关联一个逻辑值或者表达式,返回TRUE或者FALSE.
value1: 如果为true,返回value1.
value2:如果为false,返回value2.
如果value2省略,那么假定为FALSE.如果value1省略,那么假定为TRUE.表达式可以是任何输出布尔值的函数,甚至可以是输出数字值的函数,在这种情况下,值0将被解释为false.或者字符串值,空值将被解释为false.
语法例子: if(color=="red"; 100; if(color=="green"; 50;25))
1.13 linear
描述:linear(x,m,c) 等价于sum(product(m,x),c).
语法例子: linear(x,2,4) 返回 2*x+4
1.14 log
描述:返回10的对数
语法例子: log(x)log(sum(x,100))
1.15 map
描述:map(x,min,max,target) map(x,min,max,target,default) 将输入函数x列入最小最大范围到指定的目标值.最小最大参数必须是常量.这个target和default可以是常量或函数.如果x的值不在最小最大范围内,返回指定的默认值.
语法例子: map(x,0,100,1,-1) , map(x,0,100,sum(x,599),docfreq(text,solr)) -
1.16 max
描述:max(x,c)返回x和c中的最大值
语法例子: max(myfield,0)
1.17 maxdoc
描述:返回索引中的文档数量.包含那些已经标记为删除,但是还没有被清洗的文档.这是一个常量.
语法例子: maxdoc(list1)
1.18 ms
描述:返回参数之间相差的毫秒数(milliseconds).参数可以是索引的TrieDateField字段名称,也可以是基于日期常量或NOW的日期数学式子.
语法例子:
ms():等价于ms(NOW),从新纪元(UTC时间1970年1月1日午夜12点)到现在的毫秒数
ms(a):从时间点a到现在的时间毫秒数
ms(a,b):返回毫秒数(就是a-b)
ms(NOW/DAY)
ms(2000-01-01T00:00:00Z)
ms(mydatefield)
ms(NOW,mydatefield)
ms(mydatefield,2000-01-01T00:00:00Z)
ms(datefield1,datefield2)
1.19 norm(field)
描述:返回索引中存储的norm(范数)信息. the product of the index time boost and the length normalization factor, according to the Similarity for
the field.
语法例子: norm(text)
1.20 not
描述: 逻辑非
语法例子: if (NOT value1) [ ... ]:如果value1false时,NOT value1为true
1.21 numdocs
描述:返回索引中所有文档的数量.包含被标记删除,但是还没有清除的文档.这是一个常量.
语法例子: numdocs(list1)
1.22 or
描述:一个逻辑或.(disjunction)
语法例子:(value1 OR value2)
1.23 ord
描述:通过索引字段中term的索引列表返回索引字段的顺序,字典排序通过unicode值排序.
语法例子:
ord(myIndexedField)
_val_:"ord(myIndexedField)"
如果一个字段中有三个值("apple","banana","pear"),那么排序就是ord("apple")=1ord("banana")=2ord("pear")=3
1.24 pow
描述:幂数函数pow(x,y) 等价于 xy
语法例子: pow(x,y) pow(x,log(y)) pow(x,0.5) 和x的开平方根相同
1.25 product
描述:返回多个参数之间的乘积.多个参数之间用逗号隔开.
语法例子:product(x,y,...) ,product(x,2),product(x,y)
1.26 query
描述:query(subquery, default) 返回给定的子查询的评分,如果不匹配这个查询,返回默认值default.子查询的参数支持引用如$otherparam或者在本地参数中通过"v"来指定.
语法例子:
q=product(popularity, query({!dismax v='solr rocks'}): 返回popularity 和 query的评分的乘积.
q=product(popularity,query($qq))&qq={!dismax}solr rocks:等价于上一个查询.
q=product(popularity,query($qq,0.1))&qq={!dismax}solr rocks:当这个DisMax查询不匹配时,指定一个默认评分0.1.
1.27 recip
描述:倒数.recip(myfield,m,a,b) a/(m*x+b 其中 m,a,b都是常量,x是一个组合函数.和rord函数一起使用可以用于加权近期的文档.
语法例子:recip(rord(creationDate),1,1000,1000)
1.28 rord
描述:返回ord排序的反转顺序.
语法例子:
rord(myDateField):文档存在时间大小的一个度量,文档存在时间最小的文档返回1,最老的文档将会返回文档的总数.
_val_:"rord(myDateField)"
1.29 scale
描述: scale(x,minTarget,maxTarget) 落在minTarget和maxTarget之间的缩放值.
语法例子:scale(x,1,2):x的缩放值只能在1和2之间
1.30 sqedist
描述: 欧氏距离平方计算两个范数(欧氏距离),但是但不走平方根,从而节省了很大开销的操作.
语法例子:sqedist(x_td, y_td, 0, 0)
1.31 sqrt
描述:指定任何值或者函数的平方根--√ ̄.
语法例子:sqrt(x)sqrt(100)sqrt(sum(x,100))
1.32 strdist
描述:计算两个字符串之间的距离.使用Lucene拼写检查接口StringDistance.支持这个包下的所有实现,
strdist(string1, string2, distance measure),distance measure的可能参数有:
jw: Jaro-Winkler
edit: Levenstein(莱文斯坦)或者编辑距离
ngram: The NGramDistance, if specified, can optionally pass in the ngram size too. Default is 2.
FQN: Fully Qualified class Name for an implementation of the StringDistance interface. Must have a no-arg constructor
语法例子:strdist("SOLR",id,edit)
1.33 sub
描述: sub(x,y) 返回x-y
语法例子:sub(myfield,myfield2) sub(100,sqrt(myfield))
1.34 sum
描述:求和,多个参数逗号隔开.
语法例子:sum(x,y,...) sum(x,1) sum(sqrt(x),log(y),z,0.5)
1.35 sumtotaltermfreq
描述:返回所有条目频率的总和.
语法例子:
如果 doc1:(fieldX:A B C) 和 doc2:(fieldX:A A A A):
docFreq(fieldX:A)= 2 (A appears in 2 docs)
freq(doc1, fieldX:A)= 4 (A appears 4 times in doc 2)
totalTermFreq(fieldX:A) = 5 (A appears 5 times across all docs)
sumTotalTermFreq(fieldX)= 7 in , there are 5 As, 1 B, 1 C
1.36 termfreq
描述:返回一个文档的字段中term的出现频率
语法例子:termfreq(text,'memory')
1.37 tf
描述:term频率.Similarity中使用到这个因素.
语法例子:tf(text,'solr')
1.38 top
描述:
语法例子:
1.39 Totaltermfreq
描述:整个索引中,指定字段下的指定term的总数量.
语法例子:
1.40 xor()
描述:Logical exclusive disjunction,一个或者其他的,但是不能两者都包括.
语法例子:xor(field1,field2)返回true,如果field1或者field2为true.如果都为true的话,返回false.
为了更好的理解函数是如何在solr中使用的,我们举出了以下的例子
1.假设在字段boxname中存储了一些箱子的尺寸:x,y,z.假设你想搜索匹配名字findbox的箱子,并且通过箱子的体积排序,那么查询可能是:
q=boxname:findbox_val_:"product(product(x,y),z)
2.假设还有一个字段存储箱子的重量:weight,按照箱子的密度排序,并在评分中返回箱子的密度的值:
http://localhost:8983/solr/select/?q=boxname:findbox_val_div(weight,product(product(x,y),z))"&fl=boxname x y z weight score
3.查询结果通过距离排序:
http://localhost:8983/solr/select?q=*:*&sort=dist(2, point1, point2) desc
4.&fl=id,sum(x, y),score 的返回结果:
<str name="id">foo</str> <float name="sum(x,y)">40</float> <float name="score">0.343</float>