对lucene 的打分公式的我的理解

内容集合了多个 博文和ppt spa

lucene的评分公式以下: orm

一 概念: 排序

一、Token:倒排表最小单位,即分词中 词。 文档

二、Term:query的最小单位 get

三、Tf:一个term在一个文档中出现的次数 it

四、Idf:一个term在多少个文档中出现过 搜索

二 向量空间模型的计算 lucene

一、余弦定理 im

二、Vq为 query向量,Vd为document向量,通过分词以后成为 多个term,query与要搜索的document造成一个N维数量空间。 查询

查询向量为Vq = <w(t1, q), w(t2, q), ……, w(tn, q)>
文档向量为Vd = <w(t1, d), w(t2, d), ……, w(tn, d)>
Term的权重: W=tf*idf,即表示 该Term在该 文档(query或者document)中的权重

由于,在query中,
   则:
Vq*Vd = w(t1, q)*w(t1, d) + w(t2, q)*w(t2, d) + …… + w(tn ,q)*w(tn, d)
=tf(t1, q)*idf(t1, q)*tf(t1, d)*idf(t1, d) + …… + tf(tn,q)*idf(tn, q)*tf(tn, d)*idf(tn, d)

三、

由于,在 query中,不太可能分词后出现多个相同的term,假设这种状况成立,即tf(t,q)=1,

又由于 query与 要搜索的多个document相比,词量实在太少。因此, idf(t,q)约等于idf(t,d)    


这时:


Vq*Vd = tf(t1, d)*idf(t1, d)^2+......+ tf(tn, d)*idf(tn, d)^2

四、接着,咱们就开始 计算向量模了,即 V

Lucene采用的Similarity,认为在计算文档(document)的向量长度的时候,每一个Term的权重(W=tf*idf)就再也不考虑在内了,而是所有为一.若是按权重去计算的话,由于

查询语句中tf都为1,idf查询语句这篇小文档 即idf(t,q) = idf(t,d),获得以下公式


代入余弦公式,即获得

加上lucene本身的各类boost和coord


3、继续细分理解

一、协调因子 coord(q,d)

overlap(命中查询个数)
maxOverlap(总查询个数)
搜索语句为: 图书名称:”红楼梦”  ||  做者:”红楼梦”
doc1: 图书名称:红楼梦 做者:曹雪芹 coord(q,d) = 1/2,查询了两个域,命中了一个
doc2: 图书名称: 红楼梦 做者:红楼梦编委  coord(q,d) 2/2  (高),查询了两个域,命中了两个


二、查询规范因子 queryNorm(q)  (对排序无任何影响,由于在某次的搜索中,其值同样的)
     queryNorm(q) = 1/(q.getBoost()^2·∑( idf(t)·t.getBoost() )^2)

3.文档词频因子 tf(t in d) 
      tf(t in d) = Math.sqrt(freq)

例如 搜索 图书名称:红楼梦
  文档1:图书名称:红楼梦  tf=1
  文档2:图书名称:红楼梦曹雪芹签名版红楼梦  tf=1.414  (高,由于它在该一个文档中,出现一次)

四、文档出现频率因子 idf(t)
  idf(t) = 1.0 + log(numDocs/(docFreq+1))  

numDocs(总文档数)
docFreq(有几个文档中出现了查询的词)
例如搜索语句为:图书名称:“红楼梦” || 做者:“曹雪芹” 总文档数为1000
若是图书名称中包含图书名称“红楼梦”的文档数为100 idf= 2.0
做者名称中包含做者“曹雪芹”的文档数为10  idf= 3.0  (高)

五、查询权重t.getBoost

在solr中的写法为:itemName:红楼梦^10.0  itemDesc:红楼梦

六、标准化因子 norm(t,d)
norm(t,d) = doc.getBoost()· lengthNorm· ∏ f.getBoost() (注意:4.0之后没有了 doc.getBoost())
lengthNorm = 1.0 / Math.sqrt(numTerms) 


doc.getBoost() (在每一个文档上设置的权重)
f.getBoost() (在每一个字段上设置的权重
lengthNorm = 1.0 / Math.sqrt(numTerms) 
表示字段长度对打分的影响
例如:文档1:图书名称:红楼梦 lengthNorm = 1/1.7 (高)
     文档2:图书名称: 红楼梦新刊第28期 = 1/3  

4、将上面1-6部分细化的部分代入上面公式获得 score(q,d)   =   (overlap / maxOverlap  )·(1/(q.getBoost()^2·∑( idf(t)·t.getBoost() )^2)  ) · ∑( tf(t in d)·idf(t)^2·t.getBoost()· doc.getBoost()· lengthNorm· ∏ f.getBoost() )

相关文章
相关标签/搜索