这个主要对lucene的评分公式里面的各个参数做一个详细的解释。其他的可参照
1. http://book.csdn.net/bookfiles/28/10028814.shtml
2. http://blog.csdn.net/wawaboss/archive/2006/12/31/1471565.aspx
score(q,d)= coord(q,d)* queryNorm(q)*
∑
( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) )
t in q
tf(t in d) 表示的是查询条件中,每个(t:term)在本文档(d)中的出现频率。查询关键词出现的频率越高,文档的得分就越高。这个部分的默认计算公式是:
tf(t in d) =
frequency½
idf(t) 表示的是反转文档频率( Inverse Document Frequency).这个函数表示的是(t:term)在所有文档中一共在多少个文档中出现过。因为文档出现的次数越少就越容易定位,所以文档数越少,得分就越高。这个函数的默认计算公式如下:
idf(t) =
1 + log (
numDocs
–––––––––
docFreq+1
)
boost(t.field in d)表示文档得分,它包括
Document boost – 文档的boost,是建索引的时候设置的文档得分。
Field boost – 在将一个字段加入到文档中去的时候加入的字段得分。(不同的字段得分不同有利于排序,例如标题的得分应该比内容的得分要高等)
boost(t.field in d)=doc.getboost*
∏
f.getBoost()
field f in d named as t
lengthNorm(field) – 文档在建立索引的时候加入的一个参数,根据文档的某个字段含有的Term数量来计算的。Term数量比较少的字段将得到更多的得分。这个函数是由Similarity类在建立索引的时候计算的。(1/numTerms*numTerms)coord(q,d) 这个函数表示的是在这个文档(d)中Term(t)出现的百分比,也就是文档中出现的不同Term数量和查询条件(q)中的不同Term(t)的数量之比。所以,文档中出现的Term种类越多,分值就高。queryNorm(q) 这个函数是一个调节因子,不影响具体的排序情况。主要是用来让排序结果在不同的查询条件(或者不同的索引)之间可以比较。这个条件是在搜索的时候计算的。它的计算公式如下:
queryNorm(q) = queryNorm(sumOfSquaredWeights) =
1
––––––––––––––
sumOfSquaredWeights½
The sum of squared weights (查询条件的terms)是由查询的权重对象计算的。不同的查询方式,有不同的计算方法。例如:Boolean query的计算公式如下:
sumOfSquaredWeights = q.getBoost() 2 ·
∑
( idf(t) · t.getBoost() ) 2
t in q