当索引很好时使用规范,我的问题是非常短的字段排名不合适。例子:
doc1 : tf(200) out of 1.000 
doc2 : tf(150) out of 500
doc2 会得分更高,而且很棒。
问题是当我有:
doc3 : tf(3) out of 4
在我的情况下这不是很好,因为它是一个非常罕见的文件,让我们说一个例外。
我读过 KinoSearch 或有人建议引入一个常数来抵消这个问题。关于我如何仍然可以充分利用使用规范并避免这个问题的任何想法?
谢谢
当索引很好时使用规范,我的问题是非常短的字段排名不合适。例子:
doc1 : tf(200) out of 1.000 
doc2 : tf(150) out of 500
doc2 会得分更高,而且很棒。
问题是当我有:
doc3 : tf(3) out of 4
在我的情况下这不是很好,因为它是一个非常罕见的文件,让我们说一个例外。
我读过 KinoSearch 或有人建议引入一个常数来抵消这个问题。关于我如何仍然可以充分利用使用规范并避免这个问题的任何想法?
谢谢
您可以创建自己的Similarity类,扩展DefaultSimilarity,并简单地覆盖该lengthNorm方法。默认的 lengthNorm 实现非常简单:
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)));
}
将其替换为对您而言有意义的任何算法。真的,最后一行可能是您真正需要担心的所有修改,尤其是1.0 / Math.sqrt(numTerms). 这里要记住两件事:
您可以将 Solr 设置为在您的架构中使用您的相似性,例如:
<similarity class="this.is.my.CustomSimilarity"/>