之前我在跟别人分享solr(lucene)的时候,在谈论到一些特殊的query,比如prefixquery、wildcardQuery的时候,我曾经说过一句话:query就是得到词典表中的term,然后判断是不是符合条件,有的query(比如termquery)仅仅是判断词典表中的词和要查找的词是否相等,prefixQuery是判断是不是以制定的字符串开头,wildcardQuery是判断是不是符合某个正则表达式,等等,我们可以实现更加复杂的query来实现更加复杂的条件,比如function query。当然这句话纯粹是我自己的判断,没有实际的例子证明。
今天我在读了function query的代码后,发现我想错了,funcitonQuery并不是为了实现复杂的判断逻辑而存在的。我先说一下他都是做了什么吧,他里面有一个vlaueSource(就是获得索引中的某些值,可能是来自于doc的某个属性,也可能是需要现计算出来的一些值,在下面会有介绍),然后他在计算得分的时候使用了这个valueSouce中对于某个id的doc的值,是作为一个数字加到默认的得分上去的,默认的得分只有一个参数,那就是使用的query的boost,他的结果是返回所有的doc,看看FunctionQuery生成的FunctionWeight的scorer方法,
@Override public Scorer scorer(AtomicReaderContext context, Bits acceptDocs) throws IOException { return new AllScorer(context, acceptDocs, this, queryWeight); }
他是返回了一个AllScorer,顾名思义也知道他是返回所有的doc的scorer,看看他的next方法吧:
@Override public int nextDoc() throws IOException { for(;;) { ++doc; if (doc>=maxDoc) { return doc=NO_MORE_DOCS; } if (acceptDocs != null && !acceptDocs.get(doc)) continue; return doc; } }
可以看出,只要一个doc没有被删除就会被返回,所以可以确定的说这个AllScorer就是返回所有的doc。
我用solr做了一个例子,使用function query,发现他获得了所有doc,例子为:使用edismax的queryParser,q设置为:{!func}sub(someField,22),在debugQuery的情况下,我看到了他的确是生成了一个FunctionQuery。
上面我说的复杂的倒排表的选择是这个意思:比如我要在一个人才的lucene的索引中查找身高和体重符合一定条件的人(比如加起来是300的,如果一个人身高170,130斤,那么就应该召回),本来我以为function query就是要实现这种复杂逻辑的呢,但是在我看了他的源码之后,发现他不是做这个的。因为他仅仅是突出的使用了valueSource,valueSource是来自于field cache(也就是词典表或者docValue),而这个显然无法和倒排表扯上关系,所以我可以肯定的说,function query的作用很简单,就是利用valueSource来计算一个简单的得分的。
那么既然FunctionQuery的作用那么小,那用它来做啥子呢?
很简单,作为排序的一个条件,因为他只能计算valueSource的值和自己的boost,那就可以很方便的使用它计算一个值作为排序的标准,在solr里面使用它就是一个很好的例子!
既然用到了value source,就说一句吧,value source就是获得一个doc的某个值,比如可以是一个域的值,或者是多个域的值得函数值(比如域中某些term的tf),也可以是指定的某个常数的值(比如常数类型的valueSource),这就能很好的理解solr中的那些函数了,比如max、sub、div,这些就是对一个doc的多个域的值进行一个函数操作后把最后的结果用来计算得分的。所以这样一来,理解solr的那些函数就很简单了,我们也就能自己实现一些函数来实现更加复杂的功能了!
最后再重复一边,functionquery并不是一个复杂的query,我之前理解错了,纠正这个误区!
相关推荐
多媒体CAI课件制作中的几个误区探析多媒体CAI课件制作中的几个误区探析
以下是中国人民大学马光荣老师关于"经济学实证研究中常见的40个误区"的讲座内容。 关于马光荣老师,参看:那个很早就发AER的中国青年学者, 通过巧秒的空间(地理)断点设计RDD发了(小)JPE! 1. 不学理论 理论的高度...
CAD软件使用中的几个误区.pdf
关于Java在软件开发中的误区分析.pdf
你不知道的的十个思维误区你不知道的的十个思维误区你不知道的的十个思维误区你不知道的的十个思维误区你不知道的的十个思维误区你不知道的的十个思维误区你不知道的的十个思维误区你不知道的的十个思维误区你不知道...
UML建模的误区UML建模的误区UML建模的误区UML建模的误区
关于竞品分析的误区.pdf
上下拉电阻拉一个单纯的输入信号,电流也就几十微安以下,但拉一个被驱动了的信号,其电流将达毫安级,现在的系统常常是地址数据各32位,可能还有244/245 隔离后的总线及其它信号,都上拉的话,几瓦的功耗就耗在这些...
初学Web标准的几个误区,........
随着语音、视频和数据网络的逐步融合,越来越多的企业开始意识到部署IP商业通信解决方案的...在本文中,我们将介绍关于这些误区的实际情况,提供一些可以帮助您明智地决定是否部署融合式网络和IP通信解决方案的信息。
基于Oracle安全的一个误区及其解决方案.pdf
技术面试十大误区.rar技术面试十大误区.rar技术面试十大误区.rar
浅析软件项目管理中十个误区,使得项目经理注意项目管理中容易出现的问题。
Vivado使用误区与进阶,对适用vivado的开发人员有巨大帮助
【整理版】告诉你外语学习的真实方法及误区分析.pdf【整理版】告诉你外语学习的真实方法及误区分析.pdf【整理版】告诉你外语学习的真实方法及误区分析.pdf【整理版】告诉你外语学习的真实方法及误区分析.pdf【整理版...
煤矿本质安全管理体系(简称本安体系)在实施过程中,人们在认识上产生了许多误区,导致体系在推广中遇到很多阻力。而如何消除误区和阻力,使体系能够得到更好的运行与实施,就必须从理论上加以进一步的阐述与解释。主要的...
大数据的5个误区破解误区方能挖掘数据价值.pdf
讲述了用户调研的主要误区,这篇文章值得很多从事用户研究的专业人员进行专注研究。避免出现误区
对FPGA初学者容易出现的三个误区进行了详细的描述