Lucene 中的相似度排序主要是在org.apache.lucene.search 包下的 Similarity类中定义的,其排序算法如下:
<o:p> </o:p>
score(q,d) =
Σ ( tf(t in d) * idf(t)^2 * getBoost(t in q) * getBoost(t.field in d) * lengthNorm(t.field in d) ) * coord(q,d) * queryNorm(sumOfSqaredWeights)
t in q
<o:p> </o:p>
sumOfSqaredWeights =
Σ ( idf(t) * getBoost(t in q) )^2
t in q
<o:p> </o:p>
Similarity是一个抽象类,默认的相似度排序算法是在DefaultSimilarity类中实现,<o:p></o:p>
tf 为 Math.sqrt(freq),其中freq为标引项在d 中的频度
idf 为 (Math.log(numDocs/(double)(docFreq+1)) + 1.0)
lengthNorm 为长度标准化因子
(1.0 / Math.sqrt(numTerms)) 其中numTerms为标引项
coord(q,d) 查询词q在在文档d中命中的个数越多,则该因子也就越大
public float coord(int overlap, int maxOverlap) {<o:p></o:p>
return overlap / (float)maxOverlap;<o:p></o:p>
}<o:p></o:p>
其中overlap为命中的个数,maxOverlap为查询词的个数<o:p></o:p>
queryNorm 这一项不影响排序