我如何规范化solr / lucene得分?

时间:2010-10-21 09:53:39

标签: search lucene solr normalization tf-idf

我正在努力研究如何提高solr搜索结果的得分。我的应用程序需要从solr结果中获取分数,并根据查询的结果有多好来显示一些“星星”。 5星=差不多/精确到0星,意味着不能很好地匹配搜索,例如只有一个元素命中。然而,我得到的分数从1.4到0.8660254都返回结果,我会给5星。我需要做的是以某种方式将这些结果转换为百分比,以便我可以用正确的星数来标记这些结果。

我运行的查询给出了1.4分:

euallowed:true AND(等级:“2:1”)

给我0.8660254得分的查询是:

euallowed:true AND(等级:“2:1”或等级:“1st”)

我已经更新了Similarity,因此tf和idf返回1.0,因为我只对文档中有一个术语而不是文档中该术语的编号感兴趣。这就是我的相似性代码:

import org.apache.lucene.search.Similarity;

public class StudentSearchSimilarity extends Similarity {

    @Override
    public float lengthNorm(String fieldName, int numTerms) {
        return (float) (1.0 / Math.sqrt(numTerms));
    }

    @Override
    public float queryNorm(float sumOfSquaredWeights) {

        return (float) (1.0 / Math.sqrt(sumOfSquaredWeights));

    }

    @Override
    public float sloppyFreq(int distance) {
        return 1.0f / (distance + 1);
    }

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

    @Override
    public float idf(int docFreq, int numDocs) {

        //return (float) (Math.log(numDocs / (double) (docFreq + 1)) + 1.0);
        return (float)1.0;

    }

    @Override
    public float coord(int overlap, int maxOverlap) {
        return overlap / (float) maxOverlap;
    }
}

所以我想我的问题是:

  1. 如何规范化的最佳方式 得分,以便我可以弄清楚如何 许多“明星”给予?

  2. 还有另一种得分方式吗? 结果

  3. 谢谢

    捐赠

3 个答案:

答案 0 :(得分:16)

引用http://wiki.apache.org/lucene-java/ScoresAsPercentages

  

人们经常想要根据Lucene分数计算“百分比”,以确定什么是“100%完美”匹配与“50%”匹配。这也是称为“标准化分数”的事情

     

不要这样做。

     

严重。不要试图以这种方式思考你的问题,它不会结束。

该页面确实举例说明了理论上如何做到这一点,但这很难。

答案 1 :(得分:2)

它被称为标准化分数(Scores As Percentages)。

您可以使用以下参数来实现:

ns = {!func}product(scale(product(query({!type=edismax v=$q}),1),0,1),100)
fq = {!frange l=20}$ns

其中20是你的20%门槛。

另见:

Remove results below a certain score threshold in Solr/Lucene?

http://article.gmane.org/gmane.comp.jakarta.lucene.user/12076 http://article.gmane.org/gmane.comp.jakarta.lucene.user/10810

答案 2 :(得分:0)

我从来没有在Solr中做过任何复杂的事情,因此可能有一种方法可以将其作为插件挂钩 - 但是当返回结果集时,您可以在客户端中处理它。如果按相关性排序,则应该是明确的 - 得到第一个结果(最大值)和最后一个(最小值)的相关性。然后对于具有相关性x的每个结果,您可以计算

normalisedValue = (x - min) / (max - min)

将为您提供0到1之间的值。乘以5并舍入以获得星数。