您可以创建自己的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"/>