17

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

我运行的给我 1.4 分的查询是:

euallowed:true AND(等级:"2:1")

给我 0.8660254 分数的查询是:

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

我已经更新了相似度,以便 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. 是否有另一种方法对结果进行评分?

谢谢

授予

4

3 回答 3

17

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

人们经常希望从 Lucene 分数中计算“百分比”,以确定什么是“100% 完美”匹配与“50%”匹配。这也称为“标准化分数”

不要这样做。

严重地。停止尝试以这种方式思考你的问题,它不会有好的结局。

该页面确实提供了一个示例,说明您在理论上如何做到这一点,但这非常困难。

于 2010-10-22T16:31:34.967 回答
2

它被称为归一化分数(分数为百分比)。

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

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

其中 20 是您的 20% 阈值。

也可以看看:

在 Solr/Lucene 中删除低于某个分数阈值的结果?

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

于 2013-04-02T13:22:17.063 回答
0

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

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

这将为您提供一个介于 0 和 1 之间的值。乘以 5 并四舍五入得到星数。

于 2010-10-21T16:12:36.093 回答