如何更改Solr的评分功能以减轻“术语频率”的重量?
我正在使用类似pagerank的文档提升作为相关因素。我的搜索索引目前放置了许多“垃圾邮件”或未经过很好清理的文档,并且重复使用了重复的单词。
我知道得分是按术语频率(搜索术语在文档中的频率),逆文档频率和其他(How are documents scored?)计算的。我可以增加提升,但这也会忽略其他因素。
是在查询时指定函数的方法(以及默认函数是什么),还是我必须更改配置并重新索引?我正在使用django-haystack和solr,如果它有所作为。
答案 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
下是否正在使用新的相似性类。