Lucene Score 评分机制
先来看几个数学公式,参考官方文档对TFIDFSimilarity的说明
分值算法公式:
\[score(q,d)=coord(q,d)*queryNorm(q)\sum_{t\ in\ d }(tf( t\ in\ d )*idf(t)^2*t.getBoost()*norm(t,d)\]其中
- tf(t in d) 表示词频,Term在当前文档中出现的次数
- idf(t) 词的逆词频
- coord(q,d) 评分因子。越多的查询项(Term)在一个文档中,说明这些文档的匹配程序越高
- queryNorm(q) 标准化因子,用于查询时比较
- t.getBoost() 权重,这个可以在查询的时候给定(如:lucene^2),也可以在索引的时候由setBoost()给定
- norm(t,d) 字段加权(Field boost ), 文档加权(Document boost)和长度因子由字段内的 Token 的个数来计算此值,字段越短,评分越高,在做索引的时候由 Similarity.lengthNorm 计算,norm这个值在索引的时候会encode 成一个byte 保存在索引中,搜索的时候,再把索引中 norm 值decode成一个float值,在这个过程中会有精度丢失,不保证可逆,如decode(encode(0.89)) = 0.75。