Lucene评分调整

Lucene评分调整,lucene,tweak,scoring,Lucene,Tweak,Scoring,如何在给定的查询“20”中实现这一点,内容为“something 20”的文档具有类似于MAX_SCORE的内容,而其他文档(例如“something 20/12”)具有常规内容 我在玩覆盖相似性算法来简化搜索,但这种行为现在很痛苦。。我需要将lengthNorm因子设置为“1”,因为我不希望有“较短的文档会有更高的分数”的行为(如果没有这个“20”,显然会赢,但不是因为它完全适合,而是因为它较短…) 我的自定义相似性类目前看起来就是这样 public class SimpleSimilarit

如何在给定的查询“20”中实现这一点,内容为“something 20”的文档具有类似于
MAX_SCORE
的内容,而其他文档(例如“something 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;
    }
}

您仍然可以使用自定义相似性来执行此操作。 您不需要较小的文档来获得较高的分数,但您需要分数中的(匹配标记/文档中的总术语)比率

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

getLength()返回文档中标记的数量

根据相似度得分方程() lengthNorm()将为每个匹配的术语添加,您将获得的净比率(文档中匹配的标记/术语总数)

现在,在您的示例中,如果查询为“20”,则返回文档的顺序如下 1) 20(文档只有一个与查询匹配的术语)-分数~1.0 2) 20左右(文档有两个术语和一个匹配项)-分数~0.5
3) 大约20/12(文档有三个术语,一个匹配)-分数~0.33

重复?有点不同。我编辑了一份文件的问题内容。如果它不会被标记化等等,“something 20”和“something 20/12”在我查询“20”时可能不会得到任何分数,谢谢您的回复,但它仍然偏向于较短的文档。我希望查询“20”时“something 20”和“something 20”的得分相同(MAX),当然,当您的语料库中的单个文档的大小几乎相似时,这将非常有效。也许你可以在索引时间做点什么?如添加自定义标记器/分析器以将“20/12”保留为一个术语(当前标准分析将此拆分为两个术语)?您的文档中是否有任何独特的模式(比如您对XX/YY类型感兴趣?),如果有,您可以按照此模式设计分析仪。
@Override
public float lengthNorm (FieldInvertState state)
{
    return (float) 1.0 / state.getLength();
}