lucene结构详解之八标准化因子文件(nrm)

为什么会有标准化因子呢?从第一章中的描述,我们知道,在搜索过程中,搜索出的文档要
按与查询语句的相关性排序,相关性大的打分(score)高,从而排在前面。相关性打分(score)
使用向量空间模型(Vector Space Model),在计算相关性之前,要计算 Term Weight,也即某
Term相对于某Document的重要性。在计算Term Weight时,主要有两个影响因素,一个是
此 Term在此文档中出现的次数,一个是此 Term的普通程度。显然此 Term在此文档中出现
的次数越多,此 Term在此文档中越重要。 
这种 Term Weight的计算方法是最普通的,然而存在以下几个问题: 
 1)不同的文档重要性不同。有的文档重要些,有的文档相对不重要,比如对于做软件的,
在索引书籍的时候,我想让计算机方面的书更容易搜到,而文学方面的书籍搜索时排名
靠后。  
2) 不同的域重要性不同。有的域重要一些,如关键字,如标题,有的域不重要一些,如附
件等。同样一个词(Term),出现在关键字中应该比出现在附件中打分要高。  
3)  根据词(Term)在文档中出现的绝对次数来决定此词对文档的重要性,有不合理的地方。
比如长的文档词在文档中出现的次数相对较多,这样短的文档比较吃亏。比如一个词在
一本砖头书中出现了10 次,在另外一篇不足100 字的文章中出现了9次,就说明砖头
书应该排在前面码?不应该,显然此词在不足100字的文章中能出现9 次,可见其对此
文章的重要性。  
由于以上原因,Lucene 在计算 Term Weight 时,都会乘上一个标准化因子(Normalization 

Factor),来减少上面三个问题的影响。

标准化因子(Normalization Factor)是会影响随后打分(score)的计算的, Lucene 的打分计算一部
分发生在索引过程中,一般是与查询语句无关的参数如标准化因子,大部分发生在搜索过程

中,会在搜索过程的代码分析中详述。 
标准化因子(Normalization Factor)在索引过程总的计算如下:


它包括三个参数: 
 1)Document boost:此值越大,说明此文档越重要。  
 2)Field boost:此域越大,说明此域越重要。  
 3)lengthNorm(field) = (1.0 / Math.sqrt(numTerms)):一个域中包含的 Term总数
文档越长,此值越小,文档越短,此值越大。  
从上面的公式,我们知道,一个词(Term)出现在不同的文档或不同的域中,标准化
比如有两个文档,每个文档有两个域,如果不考虑文档长度,就有四种排列组合
档的重要域中,在重要文档的非重要域中,在非重要文档的重要域中,在非重要
要域中,四种组合,每种有不同的标准化因子。 
于是在 Lucene 中,标准化因子共保存了(文档数目乘以域数目)个,格式如下: 





 标准化因子文件(Normalization Factor File: nrm):  
 1)NormsHeader:字符串“NRM”外加 Version,依 Lucene 的版本的不同而不同。  
 2)接着是一个数组,大小为NumFields,每个 Field一项,每一项为一个Norms。  
 3)Norms也是一个数组,大小为 SegSize,即此段中文档的数量,每一项为一个Byte,
表示一个浮点数,其中0~2 为尾数,3~8 为指数。  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值