在Solr中的查询时忽略tf/idf

在Solr中的查询时忽略tf/idf,solr,lucene,Solr,Lucene,我正试图根据字段值增强特定文档。它通常工作正常,但有些文档返回更高的分数,即使它们的提升值较小 在使用debugQuery=onrequest参数调试查询后,我注意到idf函数为特定文档返回更高的分数,这会影响总体分数 有没有办法在查询时忽略tf/idf评分?您需要创建一个覆盖tf和idf方法的自定义方法,并使用它来代替DefaultSimilarity 比如: class CustomSimilarity extends DefaultSimilarity { @Override

我正试图根据字段值增强特定文档。它通常工作正常,但有些文档返回更高的分数,即使它们的提升值较小

在使用
debugQuery=on
request参数调试查询后,我注意到
idf
函数为特定文档返回更高的分数,这会影响总体分数


有没有办法在查询时忽略tf/idf评分?

您需要创建一个覆盖tf和idf方法的自定义方法,并使用它来代替DefaultSimilarity

比如:

class CustomSimilarity extends DefaultSimilarity {

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

    @Override
    public float tf(int freq) {
        return 1.0;
    }

    @Override
    // Note the signature of this method may now take longs:
    //   public float idf(long docFreq, long numDocs)
    public float idf(int docFreq, int numDocs) {
        return 1.0;
    }
}
将其设置为在schema.xml中使用该相似性:

<similarity class="myorg.mypackage.CustomSimilarity"/>


感谢您的回复,我希望在查询时可以切换到更简单的标志。我想知道函数查询是否是一种解决方案?我认为(不要引用我的话)通过调用(.DOCS_ONLY)可以有效地禁用字段上的“tf”评分。这将防止存储lucene计算tf值所需的TermFreqVectors。我不认为存在任何这样的选项来禁用idf。尽管如此,这就是相似性类的用途。定义评分规则。对我来说,仅仅为了防止tf评分而禁用存储向量似乎非常困难。事实上,不幸的是,我一直使用Solr,对于我的用例来说,它确实不是正确的工具,所以我想我必须找到另一种方法。不过,我会将您的回答标记为答案,因为这实际上是覆盖IDF、TF函数的最佳方式。@Chris我们已经知道TF不是零,因为计算是在命中的上下文中进行的。如果tf=0,则没有命中。如果你看一下Lucene API,你会看到这个等式
coord(q,d)·queryNorm(q)·∑ (tf(t在d中)·idf(t)2·t.getBoost()·norm(t,d))
,您可以看到,如果我们只想禁用tf和idf,将它们设置为常量(1),则会将其减少为:
coord(q,d)·queryNorm(q)·∑ (t.getBoost()·norm(t,d))
,我想这就是我们想要的。如果出于某种原因确实要添加此检查,则会传入freq,因此请进行检查。不需要调用基类。