如题。
官方描述是这样的:
但是我觉得这个说法并不好,他还是没能解决我的疑惑,因为比较两个搜索结果是通过评分的,评分中的核心是 tf idf,和长度归一因子(fieldNorm),这不就等于没解释吗?
而且根据查询归一化的公式,也不是很理解: queryNorm = 1 / √sumOfSquaredWeight。 ssumOfSquaredWeights 是查询里每个词的 IDF 的平方和。也就是说查询归一因子是和IDF有关系的,但是还是不能理解这个因子的作用
求赐教
------------------------分割线----------------------------
补充一个问题,我发现按照网上公式计算出来的idf filedNorms 总是和我集群计算出来的总是不一样,有的差了不少,很郁闷。
而且maxDocs也不准,我文档一共70W条,但是每次explain出来能差一半,难道说这个maxDocs不是指的总文档数?但是倒排索引公式中说明了:
numDocs对应explain结果中的应该就是maxDocs吧
这样岂不就和idf公式背道而驰了吗?
集群是2.2版本。
官方描述是这样的:
查询归一因子 ( queryNorm )试图将查询 归一化 , 这样就能将两个不同的查询结果相比较。
但是我觉得这个说法并不好,他还是没能解决我的疑惑,因为比较两个搜索结果是通过评分的,评分中的核心是 tf idf,和长度归一因子(fieldNorm),这不就等于没解释吗?
而且根据查询归一化的公式,也不是很理解: queryNorm = 1 / √sumOfSquaredWeight。 ssumOfSquaredWeights 是查询里每个词的 IDF 的平方和。也就是说查询归一因子是和IDF有关系的,但是还是不能理解这个因子的作用
求赐教
------------------------分割线----------------------------
补充一个问题,我发现按照网上公式计算出来的idf filedNorms 总是和我集群计算出来的总是不一样,有的差了不少,很郁闷。
而且maxDocs也不准,我文档一共70W条,但是每次explain出来能差一半,难道说这个maxDocs不是指的总文档数?但是倒排索引公式中说明了:
public float idf(long docFreq, long numDocs) {
return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
}
numDocs对应explain结果中的应该就是maxDocs吧
这样岂不就和idf公式背道而驰了吗?
集群是2.2版本。
2 个回复
yayg2008
赞同来自:
kennywu76 - Wood
赞同来自:
简单说,tf/idf反映的是一个term对于一个字段的重要性。 所以Lucene引入QueryNorm是为了计算一个term对于整个Query的重要性,也就是Query包含的所有term的idf放在一起做归一化,让idf成为一个相对值(稀少的term相对大众化的term的idf高) 。这样可以使得不同Query之间的得分可以做相互比较。
从ES官方文档的解释来看, 实际应用中QueryNorm往往达不到预想的目的,所以通常不会去比较两个Query之间的得分,也就是QueryNorm是一个可以忽略的因子。