文档的得分是在用户进行检索时实时计算出来的。如果在建立索引时就已经将每个文档的得分计算好,那么当用户输入任何关键字时,得分最高的文档都会被排在返回结果的最前面,这显然是不合理的。
因此,所有文档的得分应当都与用户输入的关键字有关系,而且是实时运算的结果。其实,所谓得分,可以简单理解成是某个关键字在某文档中出现的频率。
图11-6所示的公式就是Lucene用于计算某个关键字在对应于某文档的得分。
因 素 | 在公式中的作用描述 |
tf(t in d) | 词条t在文档d中出现的词频,出现次数越多文档得分越高 ↑ |
idf( t ) | 词条t在所有文档中的倒排词频,出现文档数越多,t越不重要,得分越低↓ |
boost(t.field in d) | 在索引过程中设置的字段参数,field的权重↑ |
lengthNorm(t.field in d) | 字段的标准化值,表明在字段中存储了多少词条,这个数值是在索引过程中计算出来的,并且也存储在索引中↓ |
coord(q, d) | 协调因子,它的计算是基于文档d中所包含的所有可供查询的词条数量↑ |
queryNorm(q) | 在给出每个查询条目的方差和后,计算某查询的标准化值↑ |
总结一下,影响d得分的因素包括:
1. d中t出现的次数,
tf(t in d),
出现次数越多d得分越高
↑
2. 多少个d中t出现的频率,
idf(t)
,出现的越多得分越低
↓
3. Field的权重
↑
4. d的权重
↑
5. d的长度或者说相应的Field的长度
coord(q, d)
↓
6. d中出现了多少个q中的Term
↑