Lucene得分调整

时间:2014-12-23 12:55:40

标签: lucene tweak scoring

如何使用给定的查询实现这一点" 20",带内容的文档" 20"有类似MAX_SCORE的东西,而其他文件,例如" 20/12"经常一个?

我正在使用重写相似度算法来简化搜索,但这种行为现在很痛苦。我需要将lengthNorm因子设置为" 1"因为我不想拥有"较短的文件会得到更高的分数"行为(没有这个" 20"显然是胜利,但不是因为它完全适合,而是因为它更短......)。

我的自定义相似度类目前看起来像

public class SimpleSimilarity extends DefaultSimilarity {
    public SimpleSimilarity(){}


    @Override
    public float idf(long docFreq, long numDocs) { return 1f; }



    @Override
    public float tf(float freq) { return 1f; }


    @Override
    public float lengthNorm(FieldInvertState state) {
        return 1f;
    }
}

1 个答案:

答案 0 :(得分:0)

您仍然可以使用自定义相似性来执行此操作。 您不需要较小的文档才能获得高分,但您需要得分(文档中匹配的令牌/总条款)。

在自定义相似度中尝试此lengthNorm(保持tf / idf等,如上所述返回1f)

@Override
public float lengthNorm (FieldInvertState state)
{
    return (float) 1.0 / state.getLength();
}

state.getLength()返回文档中的标记数。

根据相似性得分方程(http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html) 将为每个匹配的术语添加lengthNorm(),净值将获得(文档中匹配的令牌/总术语)的比率。

现在在您的示例中,如果您的查询是" 20",这里是返回文档的顺序 1)20(文档只有一个与查询匹配的术语) - 得分~1.0 2)某事20(文件有两个术语,一个匹配) - 得分〜0.5 3)20/12(文件有三个术语,一个匹配) - 得分~0.33