luence评分机制

Lucene的评分机制涉及coord、queryNorm和norm等六个部分。coord因子基于查询项与文档的交集比例;queryNorm不影响排序,用于调整整体评分;norm因子考虑文档和字段长度,确保短文档优先。在实践中,norm值在存储和查询过程中可能会因精度问题产生变化。
摘要由CSDN通过智能技术生成

评分公式有6个部分组成

coord(q,d) 评分因子,基于文档中出现查询项的个数。越多的查询项在一个文档中,说明文档的匹配程度越高。
queryNorm(q)查询的标准查询
tf(t in d) 指项t在文档d中出现的次数frequency。具体值为次数的开根号。
idf(t) 反转文档频率, 出现项t的文档数docFreq
t.getBoost 查询时候查询项加权
norm(t,d) 长度相关的加权因子

coord(q, d)

这个评分因子的计算公式是:

public float coord(int overlap, int maxOverlap) {
return overlap / (float)maxOverlap;
}

overlap: 文档中命中检索的个数
maxOverlap: 检索条件的个数

比如检索"english book", 现在有一个文档是"this is an chinese book"。
那么,这个搜索对应这个文档的overlap为1(因为匹配了book),而maxOverlap为2(因为检索条件有两个book和english)。
最后得到的这个搜索对应这个文档的coord值为0.5。

queryNorm(q)

这个因素对所有文档都是一样的值,所以它不影响排序结果。比如如果我们希望所有文档的评分大一点,那么我们就需要设置这个值。

public float queryNorm(float sumOfSquaredWeights) {
return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));
}

norm(t,d)

这个项是长度的加权因子,目的是为了将同样匹配的文档,比较短的放比较前面。
比如两个文档:

chinese
chinese book

我搜索chinese的时候,第一个文档会放比较前面。因为它更符合"完全匹配"。

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

public float lengthNorm(FieldInvertState state) {
final int numTerms;
if (discountOverlaps)
numTerms = state.getLength() - state.getNumOverlap();
else
numTerms = state.getLength();
return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));
}

这里的doc.getBoost表示文档的权重,f.getBoost表示字段的权重,如果这两个都设置为1,那么nor(t,d)就和lengthNorm一样的值。

比如我现在有一个文档:

chinese book

搜索的词语为chinese, 那么numTerms为2,lengthNorm的值为 1/sqrt(2) = 0.71428571428571。

但是非常遗憾,如果你使用explain去查看es的时候,发现lengthNorm显示的只有0.625。
这个官方给出的原因是精度问题,norm在存储的时候会进行压缩,查询的时候进行解压,而这个解压是不可逆的,即decode(encode(0.714)) = 0.625。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值