减少solr中的术语频率?

时间:2017-09-29 13:47:38

标签: solr django-haystack

如何更改Solr的评分功能以减轻“术语频率”的重量?

我正在使用类似pagerank的文档提升作为相关因素。我的搜索索引目前放置了许多“垃圾邮件”或未经过很好清理的文档,并且重复使用了重复的单词。

我知道得分是按术语频率(搜索术语在文档中的频率),逆文档频率和其他(How are documents scored?)计算的。我可以增加提升,但这也会忽略其他因素。

是在查询时指定函数的方法(以及默认函数是什么),还是我必须更改配置并重新索引?我正在使用django-haystack和solr,如果它有所作为。

1 个答案:

答案 0 :(得分:1)

我不确定这是最好的方法,但这似乎有效。我在java中创建了Similarity的子类。在ClassicSimilarity中,术语频率定义为sqrt(freq)。添加乘法因子是没有意义的,因为tf与其他项相乘,而不是相加 - 比例因子将被统一应用。即scale * a * b没有意义scale * a + b。但在这种情况下你可以做的是a^scale * b。这基本上做的是它在对数中应用比例因子:log(score) = scale * log(a) + log(b)

另请注意,默认相似度函数毕竟不是TF-IDF,而是BM25。这是TF-IDF的变体。

package com.example.solr;
import org.apache.lucene.search.similarities.ClassicSimilarity;

public class CustomSimilarity extends ClassicSimilarity {
    @Override
    public float tf(float freq) {
        return (float) Math.pow(freq, 0.25); // default: 0.5
    }

    @Override
    public String toString() {
        return "CustomSimularity";
    }
}

用以下代码编译:

javac -cp /path/to/solr-6.6.1/server/solr-webapp/webapp/WEB-INF/lib/lucene-core-6.6.1.jar:. -d . CustomSimilarity.java
jar -cvf myscorer.jar com

然后,添加到solrconfig.xml

<lib path="/path/to/myscorer.jar" />

schema.xml

<similarity class="com.example.solr.CustomSimilarity">
</similarity>

重新启动solr后,您可以验证http://localhost:8983/solr/#/<corename>/schema下是否正在使用新的相似性类。