我们在 SOLR 中有很多文档,其中某些类型的结果往往得分过高(这主要是因为它们的内容通常很短)。因此,如果我搜索一个名称,它总是会在任何更长的时间之前返回大量短文档。
如何对结果进行加权,以便在对相关性进行排名时更多地考虑文档的长度?
如果它有帮助(作为一个杂物),我们会在通常适用的文档上设置一个标志,因此如果可以提升所有没有设置此标志的文档,这对我们来说将是一个临时选项。
这是由评分中的 lengthNorm 引起的。具有相同匹配词的较长文档的得分略低于短文档。请参阅TFIDFSimilarity的文档(向下滚动到“ 6. norm(t,d)
”)以及此处的 Solr 文档。
这往往适用于全文搜索应用程序。这个想法是与查询匹配的内容比例较高的文档与查询更相关。
例如,如果我在维基百科文章标题中搜索“猴子”一词,则找到的文章的相关性可能是:
如果确实有必要,可以在自定义DefaultSimilarity中覆盖它。并将 computeNorm(state,norm) 覆盖为简单return state.getBoost();
的 .
检查4.0的DefaultSimilarity的来源
@Override
public void computeNorm(FieldInvertState state, Norm norm) {
final int numTerms;
if (discountOverlaps)
numTerms = state.getLength() - state.getNumOverlap();
else
numTerms = state.getLength();
norm.setByte(encodeNormValue(state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)))));
}
所以 numTerms 对评分有不利影响。
您可以创建一个覆盖行为的自定义类
((float) (1.0 / Math.sqrt(numTerms)))
以消除 lengthNorm 效应。