如何看懂nutch搜索结果中的评分详解
首先, nutch中的评分由Lucene的评分计算公式获得,分值计算方式为查询语句q中每个项t与文档颊俄岿髭d的匹配分值之和,当然还有权重的因素。
公式中的各项对应了评分详解的内容:
lf(t in d)项频率因子——文档(d)中出现项(t)的频率
lidf(t)项在倒排文档中出现的频率:它被用来衡量项的“唯一”性.出现频率较高的term具有较低的idf,出现较少的term具有较高的idf
lboost(t.field in d)域和文档的加权,在索引期间设置.你可以用该方法对某个域或文档进行静态单独加权
llengthNorm(t.field in d)域的归一化(Normalization)值,表示域中包含的项数量.该值在索引期间计算,并保存在索引norm中.对于该因子,更短的域(或更少的语汇单元)能获得更大的加权
lcoord(q,d)协调因子(Coordination factor),基于文档中包含查询的项个数.该因子会对包含更多搜索项的文档进行类似AND的加权
lqueryNorm(q)每个査询的归一化值,指毎个查询项权重的平方和
下面对“用心”检索结果的第一条信息的评分进行解释。
scorefor query:用心
0.02927261 = (MATCH) sum of:
o0.021942485 = (MATCH) weight(anchor:用心^2.0 in 373), product of:
§0.35618502 = queryWeight(anchor:用心^2.0), product of:
§2.0 = boost
§6.3082676 = idf(docFreq=1)
§0.028231604 = queryNorm
§0.061604176 = (MATCH) fieldWeight(anchor:用心in 373), product of:
§2.0 = tf(termFreq(anchor:用心)=4)
§6.3082676 = idf(docFreq=1)
§0.0048828125 = fieldNorm(field=anchor, doc=373)
o7.4737903E-4 = (MATCH) weight(content:用心in 373), product of:
§0.142725 = queryWeight(content:用心), product of:
§5.055505 = idf(docFreq=6)
§0.028231604 = queryNorm
§0.0052364967 = (MATCH) fieldWeight(content:用心in 373), product of:
§1.4142135 = tf(termFreq(content:用心)=2)
§5.055505 = idf(docFreq=6)
§7.324219E-4 = fieldNorm(field=content, doc=373)
o0.006582746 = (MATCH) weight(title:用心^1.5 in 373), product of:
§0.26713878 = queryWeight(title:用心^1.5), product of:
§1.5 = boost
§6.3082676 = idf(docFreq=1)
§0.028231604 = queryNorm
§0.02464167 = (MATCH) fieldWeight(title:用心in 373), product of:
§1.0 = tf(termFreq(title:用心)=1)
§6.3082676 = idf(docFreq=1)
§0.00390625 = fieldNorm(field=title, doc=373)
score forqurey中
第一行是总匹配分值——每个文档的域:anchor,title和content,最终匹配分值=查询语句在域中的得分之和。0.02927261=0.021942485+7.4737903E-4 +0.006582746 ;
第二行项在域的匹配分值——“用心”在title中的匹配分值0.006582746是怎么算出来的。t在field中的分值score = 查询权重queryWeight * 域权重fieldWeight,即0.006582746=0.26713878*0.02464167。
第三行queryWeight——queryWeight的默认情况下boost=1.0,本次检索为2.0,queryWeight = idf *queryNorm*boost,查询权重queryWeight0.35618502=6.3082676*0.028231604*2。
第四行boost 是域和文档的加权,取值为2.0
第五行idf是项在倒排文档中出现的频率—— docFreq是根据指定关键字进行检索,检索到的Document的数量,我们测试的docFreq=1;
第六行queryNorm——当默认的boost= 1.0情况下,sumOfSquaredWeights = idf * idf,idf分别来自 {用心} *{title, content}的组合。然后,就可以计算queryNorm的值了,计算如下所示:queryNorm = (float)(1.0 / Math.sqrt(sumOfSquaredWeights)
第七行fieldWeight——fieldWeight = tf * idf * fieldNorm
tf和idf的计算参考前面的,fieldNorm的计算在索引的时候确定了,此时直接从索引文件中读取,这个方法并没有给出直接的计算。如果使用DefaultSimilarity的话,它实际上就是lengthNorm,域越长的话Norm越小。这个我就不再验算了,每个域的Terms数量开方求倒数乘以该域的boost得出最终的结果。