最近两天重新梳理了下lucene的打分算法,是基于1.9版本的(原理一致那么就选个简单的版本来看看,看着也简单利落)。
编辑那些公式什么的也繁琐,就直接贴草稿图吧,偷个懒!
1)打分公式
公式的2、4、5部分只是和query相关,这部分计算在weight中完成!!!
2)构建weight
一下都是对termQuery进行分析,这里构建的也是TermWeight。
weight的属性value为上述公式2、4、5部分的乘积,及query的权重。
打分的过程本来就是query的权重和命中document权重的运算,这里先计算出query的权重,后面的时候交给score完成。这相当于是一个准备的工作!
3)构建scorer
同理这里构建的是:TermScorer
TermScorer有一些比较重要的属性,分别简单解释如下:
weight:参与运算query的等价物weight,他将query数值化;
weightValue:即为weight的值;
TermDocs:命中文档的迭代器;
norms:所有文档的norm值,至于怎么计算没有深入了解了,不过要注意的是他会全部加在到内存;
scoreCache:scoreCache是tf为0至31时,与weightValue相乘的结果的“缓存”,主要是避免重复计算,如果tf在0-31范围内,就可以直接取取了。
4)打分过程
以下是打分的概要过程。细节还需参考源代码!