11.2.5 Lucene的评分机制

Lucene是通过计算文档得分来确定查询结果文档与查询语句的相似度的,如果读者想要干预Lucene查询并改变查询结果的排序,就必须掌握Lucene的评分机制。

Lucene的评分机制结合了布尔模型(Boolean Model)和空间向量模型(Vector Space Model,缩写VSM),Lucene首先会通过查询语句中的布尔逻辑(AND、OR和NOT)缩小待评分的文档结果集,再基于VSM对文档结果集进行评分。

1.Lucene的评分公式

Lucene的评分公式如下:

  1. score(q,d) = coord(q,dqueryNorm(q)·Σ (tf (t in d idf(t)^2·t.getBoost()·norm(t,d))

其中,q为查询语句,t是q分词后的每一项,d为要匹配的文档。

●coord(q,d)方法表示在文档d中Term(t)出现的百分比,也就是文档中出现的不同Term数量和查询条件q中的不同Term(t)的数量之比。所以,文档中出现的Term种类越多,分值就高。

●queryNorm(q)方法是一个调节因子,不影响具体的排序情况。主要是用来让排序结果在不同的查询条件(或不同的索引)之间可以比较。这个条件是在搜索的时候计算的。

●tf(t in d)表示查询条件中每个Term(t)在文档d中的出现频率,tf是Term Frequency的缩写,表示词条频率。查询关键词出现的频率越高,文档的得分就越高。在Lucene中,它的值是真实频率的平方根值。

●idf(t)表示反转文档频率(Inverse Document Frequency),这个函数表示Term(t)在所有文档中一共在多少个文档中出现过。因为文档出现的次数越少就越容易定位,所以文档数越少,得分就越高。

●t.getBoost()方法是指在建立索引时,对每个Field设置的激励因子,默认值为1。它可以增加某个Field的重要性,同时也就增加了该文档的重要性,重要性的增加也就增加了文档的得分。例如,在检索文章时,通常会认为标题比内容更重要。

●norm(t,d)是标准化因子,它是在索引时进行计算并存储的,在查询时无法改变。

2.idf(t)的计算公式

idf(t)的计算公式如下:

  1. public float idf(int docFreq, int numDocs) {
  2. return (float)(Math.log(numDocs / (double)(docFreq+1)) + 1.0);
  3. }

其中,docFreq表示包含检索关键字的文档总数,numDocs表示索引中总共的文档数。

3.norm(t,d)计算公式

norm(t,d)计算公式如下。

  1. norm(t,d)?=?doc.getBoost()·lengthNorm·∏f.getBoost()

●doc.getBoost():文档的boost值,在索引时可以通过setBoost()方法设置。

●∏f.getBoost():在索引时,一个Document实例中,可以多次添加相同名称的Field对象,但是值不相同,对于这种情况,在计算得分的时候,要通过∏f.getBoost()连乘积来计算。

●lengthNorm:一个与Field长度(包含Term数量)有关的因子。

4.lengthNorm计算公式

lengthNorm计算公式如下:

  1. lengthNorm =?1.0?/?Math.sqrt(numTerms)?

其中,numTerms表示一个Field中Term的数量。


提示 一般来说,一个Term在越短的Field中出现,表示该Term越重要,这点与idf(t)类似。