如何使用给定的查询实现这一点" 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;
}
}
答案 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