【问题标题】:Lucene scoring tweakingLucene 评分调整
【发布时间】:2014-12-23 12:55:39
【问题描述】:

如何使用给定的查询“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;
    }
}

【问题讨论】:

  • this 的重复?
  • 有点不同。我编辑了问题 - 文档的内容。如果它不会被标记化等等,当我查询“20”时,“something 20”和“something 20/12”可能不会得到任何分数

标签: lucene tweak scoring


【解决方案1】:

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

在您的自定义相似度中尝试这个 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

【讨论】:

  • 感谢您的回复,但它仍然偏向于较短的文档。我希望查询“20”的“something 20”和“something something 20”获得相同的(MAX)分数
  • 当然,当您的语料库中单个文档的大小几乎相似时,这将非常有效。可能你可以在索引时间做点什么吗?就像添加自定义标记器/分析器以将“20/12”保留为一个术语(当前标准分析将其拆分为两个术语)?您的文档中是否有任何独特的模式(比如您对 XX/YY 类型感兴趣?),如果是,您可以按照这种模式设计您的分析仪。
猜你喜欢
  • 2019-05-04
  • 1970-01-01
  • 2011-04-04
  • 2010-09-05
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多