之前我在跟别人分享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,我之前理解错了,纠正这个误区!
相关推荐
在认识方面,第一个误区是对使用期限的关注。人们往往忽视了软件的使用时间限制,过分关注功能实现而忽略软件架构的灵活性和可拓展性,这不利于软件工程的完整性。第二个误区是误解了对象关系映射(ORM)和存储过程...
多媒体CAI课件制作中的几个误区探析多媒体CAI课件制作中的几个误区探析
5. **过度依赖单一软件**:虽然熟练掌握一个CAD工具是重要的,但只依赖一个工具可能会限制设计的多样性和复杂性。应当对多个CAD工具有所了解,以便在需要时能够切换或结合使用。 6. **错误的数据管理观念**:很多...
#### 误区三:为每块内容都建立一个ID - **核心要点**:过度使用ID不仅会导致CSS文件变得庞大和复杂,还会违背Web标准的原则。 - **详细解析**:有些初学者倾向于为页面中的每一部分都定义一个唯一的ID。这种做法...
因此,UML建模应该是一个逐步细化和迭代的过程,团队应当根据最新的信息和需求不断地调整和完善模型。 此外,一些开发者认为只有在复杂的开发过程中才需要进行UML建模,这导致了建模活动被看作是一个重量级的过程。...
实际上,一个成功的项目往往始于详尽的规划阶段。在这个阶段,需要明确项目的目标、范围、时间表、资源分配等关键要素,并确保团队成员对这些信息有共同的理解。忽视项目规划会导致目标不明确、资源浪费等问题。 ##...
上下拉电阻拉一个单纯的输入信号,电流也就几十微安以下,但拉一个被驱动了的信号,其电流将达毫安级,现在的系统常常是地址数据各32位,可能还有244/245 隔离后的总线及其它信号,都上拉的话,几瓦的功耗就耗在这些...
尽管不是所有病毒都会利用这一方式传播,但对于某些病毒来说,这是它们的一个传播途径。 #### 重要注意事项 - **内存中的病毒**:如果内存中存在病毒,即使执行如`DIR`这样的内部命令,也可能导致无毒软盘被感染。...
3. 误区三:手工计算时必须包括每一个噪声源。在大型设计中,计算每一个噪声源的噪声贡献可能非常耗时。设计人员应学会忽略低于某一阈值的噪声源,这个阈值可以是主要噪声源的1/5、1/3或1/10,因为这些低于阈值的...
其次,分析不够客观是另一个常见误区。竞品分析应当基于用户反馈和运营数据,而不是个人偏好。产品经理需要理性看待竞品,不受个人喜好影响,以市场和用户数据为依据,公正地评估产品的优缺点。此外,拥有全局观也是...
本文将详细介绍几个关于差分信号PCB布局布线时的常见误区,并提供相应的解决方案。 误区一:错误理解差分信号的回流路径 一个常见的误区是认为差分信号不需要地平面作为回流路径,或者认为差分走线彼此为对方提供...
误区1:CRM是一个销售管理系统 CRM并非仅仅是一个销售管理工具,它是一个全面的企业级管理系统,涵盖销售自动化、市场营销、客户服务等多个面向客户的业务领域。销售管理系统仅是CRM中的一个模块,CRM更强调的是跨...
随着语音、视频和数据网络的逐步融合,越来越多的企业开始意识到部署IP商业通信解决方案的...在本文中,我们将介绍关于这些误区的实际情况,提供一些可以帮助您明智地决定是否部署融合式网络和IP通信解决方案的信息。
基于Oracle安全的一个误区及其解决方案.pdf
**解析:** 在这个例子中,试图将一个字符串 `"a"` 赋值给一个字符变量 `c`,这是错误的。字符变量只能存储单个字符,而字符串 `"a"` 实际上包含两个字符 `'a'` 和结束符 `\0`。正确的做法是使用 `char c = 'a';` 来...
首先,第一个误区是过于依赖绩效考核。绩效考核虽然是衡量员工工作成果的有效手段,但其过于侧重于短期成果,不能全面反映员工的能力和潜力。优秀的人才不仅在于他们完成的业绩,还在于他们的领导力、创造力、团队...
一个成功的广告,必须清楚其核心受众是谁,并围绕这一群体的需求和喜好来设计广告内容。比如,面向小孩的广告,其内容、色彩和语言风格自然要与面向专业人士的广告有所区别。企业若未能准确判断并专注于核心目标群体...