Solr函数查询 让我们可以利用 numeric域的值 或者 与域相关的的某个特定的值的函数,来对文档进行评分。

怎样使用函数查询

这里主要有两种方法可以使用函数查询,这两种方法都是通过solr http 接口的。

  1. 内嵌在正常的solr查询表达式中。即,将函数查询写在 q这个参数中,这时候,我们使用_val_将函数与其他的查询加以区别。至于具体怎样使用,请读者留意下面的例子。
  2. 使用明确为函数查询的参数,比如说dismax中的bf(boost function)这个参数。 注意:bf这个参数是可以接受多个函数查询的,它们之间用空格隔开,它们还可以带上权重。所以,当我们使用bf这个参数的时候,我们必须保证单个函数中是 没有空格出现的,不然程序有可能会以为是两个函数。

例如: q=dismax&bf="ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3

函数的格式(Function Query Syntax)

目前,function query 并不支持 a+b 这样的形式,我们得把它写成一个方法形式,这就是 sum(a,b).

可以利用的函数 (available function)

constant

支持有小数点的常量

例如:1.5 ;

SolrQuerySyntax:_val_:1.5

fieldvalue

这个函数将会返回numeric field的值,这个域必须是indexd的,非multiValued的。格式很简单,就是该域的名字。如果这个域中没有这样的值,那么将会返回0。

ord

对于一个域,它所有的值都将会按照字典顺序排列,这个函数返回你要查询的那个特定的值在这个顺序中的排名。这个域,必须是非multiValued的,当没有值存在的时候,将返回0.

例如:某个特定的域只能去三个值,“apple”、“banana”、“pear”,那么ord(“apple”)=1,ord(“banana”)=2,ord(“pear”)=3.

需要注意的是,ord()这个函数,依赖于值在索引中的位置,所以当有文档被删除、或者添加的时候,ord()的值就会发生变化。当你使用MultiSearcher的时候,这个值也就是不定的了。

rord

这个函数将会返回与ord相对应的倒排序的排名。

格式: rord(myIndexedField).

sum

这个函数的意思就显而易见啦,它就是表示“和”啦。

格式:sum(x,1)

sum(x,y)

sum(sqrt(x),log(y),z,0.5)

product

product(x,y,...)将会返回多个函数的乘积。

格式:product(x,2)

product(x,y)

div

div(x,y)表示x除以y的值

格式:div(1,x)

div(sum(x,100),max(y,1))

pow

pow表示幂值。pow(x,y) =x^y。

例如:pow(x,0.5) 表示开方

pow(x,log(y))

abs

abs(x)将返回表达式的绝对值

格式:abs(-5)

格式:abs(x)

log

log(x)将会返回基数为10,x的对数

格式: log(x)

log(sum(x,100))

sqrt

sqrt(x) 返回 一个数的平方根

格式:sqrt(2)

sqrt(sum(x,100))

map

如果 x>=min,且x<=max,那么map(x,min,max,target)=target.

如果 x不在[min,max]这个区间内,那么map(x,min,max,target)=x.

格式:map(x,0,0,1)

scale

scale(x,minTarget,maxTarget) 这个函数将会把x的值限制在[minTarget,maxTarget]范围内。

query

query(subquery,default)将会返回给定subquery的分数,如果subquery与文档不匹配,那么将会返回默认值。任何的查询类型都是受支持的。

可以通过引用的方式,也可以直接指定查询串。

例子:q=product(popularity, query({!dismax v='solr rocks'}) 将会返回popularity和通过dismax 查询得到的分数的乘积。

q=product(popularity, query($qq)&qq={!dismax}solr rocks 跟上一个例子的效果是一样的。不过这里使用的是引用的方式

q=product(popularity, query($qq,0.1)&qq={!dismax}solr rocks 在前一个例子的基础上又加了一个默认值。

linear

linear(x,m,c)表示 m*x+c ,其中m和c都是常量,x是一个变量也可以是一个函数。

例如: linear(x,2,4)=2*x+4.

recip

recip(x,m,a,b)=a/(m*x+b)其中,m、a、b是常量,x是变量或者一个函数。

当a=b,并且x>=0的时候,这个函数的最大值是1,值的大小随着x的增大而减小。

例如:recip(rord(creationDate),1,1000,1000)

max

max(x,c)将会返回一个函数和一个常量之间的最大值。

例如:max(myfield,0)

最新文章

  1. Linux下修改Mysql的用户(root)的密码
  2. 霸气!Nginx 中缓存静态文件秘籍
  3. Bootstrap页面布局2 - 包含BS文件
  4. LOOPS(HDU 3853)
  5. 无法建立到http://localhost:6080/arcgis/manager/的连接
  6. php递归创建目录
  7. 【转】Android 驱动开发系列四
  8. 详解Spring中的CharacterEncodingFilter
  9. HDU 3478 Play with Chain (Splay树)
  10. Haskell Json数据处理
  11. 众人拾柴火焰高之Tomcat集群
  12. myeclipse10.7安装git插件
  13. CTF线下攻防赛
  14. wpf动画同步闪烁
  15. java SpringWeb 接收安卓android传来的图片集合及其他信息入库存储
  16. [ExtJS5学习笔记]第三十五节 sencha extjs 5 组件查询方法总结
  17. Liferay的一些应用领域
  18. tf.nn.dynamic_rnn
  19. python的学习之路day2
  20. TinyCore Nginx server with php-cgi and vsftpd

热门文章

  1. Django UrL 解析
  2. sqlplus rlwrap readline
  3. halcon控制显示精度(精确到小数点后6位,精度足够了)
  4. Spring cloud config-client 爬坑
  5. LUA表 pairs, ipairs输出顺序问题
  6. maven的pom报plugins缺失的解决方法
  7. 迷你MVVM框架 avalonjs 学习教程1、引入avalon
  8. Gerrit 系统初探 (已转移到 https://steemit.com/gerrit/@linvictor88/gerrit )
  9. Node.js究竟是什么?
  10. 给mysql数据添加一个只拥有一张表的权限