0

当索引很好时使用规范,我的问题是非常短的字段排名不合适。例子:

doc1 : tf(200) out of 1.000 
doc2 : tf(150) out of 500

doc2 会得分更高,而且很棒。

问题是当我有:

doc3 : tf(3) out of 4

在我的情况下这不是很好,因为它是一个非常罕见的文件,让我们说一个例外。

我读过 KinoSearch 或有人建议引入一个常数来抵消这个问题。关于我如何仍然可以充分利用使用规范并避免这个问题的任何想法?

谢谢

4

1 回答 1

2

您可以创建自己的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). 这里要记住两件事:

  • 规范以非常有损的方式压缩(大约 1 个有效十进制数字!)以节省空间。巨大的差异很重要,细微的调整往往会迷失方向。
  • 您将需要重新索引。规范在索引时存储,而不是在查询时计算。

您可以将 Solr 设置为在您的架构中使用您的相似性,例如:

<similarity class="this.is.my.CustomSimilarity"/>
于 2013-11-13T07:06:46.373 回答