【问题标题】:Give less weight to term frequency in solr?对solr中的词频给予较少的权重?
【发布时间】:2017-09-29 13:47:38
【问题描述】:

如何更改 Solr 的评分功能以减少“词频”的权重?

我使用类似 pagerank 的文档提升作为相关因素。我的搜索索引目前将许多“垃圾邮件”或未充分清理且包含重复字词的文档放在首位。

我知道分数是根据词频(搜索词在文档中出现的频率)、逆文档频率和其他 (How are documents scored?) 计算的。我可以只增加推动力,但这也会淡化其他因素。

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

【问题讨论】:

    标签: solr django-haystack


    【解决方案1】:

    我不确定这是不是最好的方法,但这似乎可行。我在 java 中创建了 Similarity 的子类。在ClassicSimilarity 中,词频定义为sqrt(freq)。添加乘法因子没有意义,因为 tf 与其他项相乘,而不是相加 - 比例因子将被统一应用。 IE。 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/#/&lt;corename&gt;/schema下是否正在使用新的相似类。

    【讨论】:

    • 随着 Solr6 的发布,默认相似度切换到 BM25。您现在还可以设置每个字段的相似性类,这样您就可以让一个字段与其他字段具有不同的计算方式。
    • 感谢您的信息!对于后验性,这里有一个关于 Lucene 中 TD-IDF 和 BM25 之间区别的指导性链接:opensourceconnections.com/blog/2015/10/16/…
    猜你喜欢
    • 2022-11-05
    • 2023-03-29
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 2015-05-06
    相关资源
    最近更新 更多