2017-09-29 59 views
0

如何更改Solr的评分函数以减少“词频”的权重?在solr中减少词频的权重?

我正在使用类似pagerank的文档提升作为相关因子。我的搜索索引目前存在许多“垃圾邮件”或没有很好清理的文档,并且在顶部有重复的文字。

我知道分数是按照词频(文档中搜索词的频率),逆文档频率等(How are documents scored?)计算的。我可以增加提振力,但这也会强调其他因素。

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

回答

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的重新启动后,你可以VERI因为在http://localhost:8983/solr/#/<corename>/schema下正在使用新的相似类。

+1

默认相似性通过释放Solr6切换到BM25。您现在也可以设置相似性类_per_field_,这样您就可以有一个字段具有与其他字段不同的计算。 – MatsLindh

+0

感谢您的信息!对于后验,下面是关于Lucene中TD-IDF和BM25之间差异的有用链接:http://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/ – jdm