为何设置omitNorms=true时Solr仍计算fieldNorm并影响评分?
Solr 3.2.0中
omitNorms=true仍出现fieldNorm的原因及计算逻辑 核心原因
Solr 3.2.0基于Lucene 3.2,这个版本里omitNorms=true的作用是关闭基于字段总token长度的归一化,但对**多值字段(multiValued=true)**有特殊处理:Lucene依然会计算一个fieldNorm值,这个值和字段中添加的独立值数量直接相关,而非单个term的出现频率。
你的fieldNorm=0.25的计算方式
你的track_hierarchynode是multiValued=true字段,在Solr 3.x的实现逻辑里,当omitNorms=true时,多值字段的fieldNorm计算公式是:
fieldNorm = 1 / 字段值的总数
如果你的文档里track_hierarchynode恰好有4个独立的标签值(比如["pop", "rock", "jazz", "blues"]),那么1/4=0.25,正好匹配你看到的结果。
这里要注意:这个计算和你看到的termFreq=5("pop"的出现次数)无关,只看该字段在文档中被添加了多少个独立的多值元素。
验证与处理建议
- 验证字段值数量:可以通过查询文档原始数据,或者在查询时添加
fl=track_hierarchynode,确认该文档的track_hierarchynode字段是否确实有4个值。 - 彻底消除fieldNorm影响:如果想完全让fieldNorm不影响评分,可以在查询时使用自定义评分逻辑,比如直接计算tf*idf:
q={!func}termfreq(track_hierarchynode,pop)*idf(track_hierarchynode,pop);或者考虑升级到更高版本的Solr(Lucene 4+之后,omitNorms=true会完全禁用多值字段的fieldNorm,行为更符合预期)。
内容的提问来源于stack exchange,提问作者sbrattla
相关产品推荐
相关产品推荐

