如何标准化 solr/lucene 分数?
Posted
技术标签:
【中文标题】如何标准化 solr/lucene 分数?【英文标题】:how do I normalise a solr/lucene score? 【发布时间】:2011-04-28 12:35:30 【问题描述】:我正在努力研究如何提高 solr 搜索结果的评分。我的应用程序需要从 solr 结果中获取分数,并根据结果对查询的好坏显示一些“星”。 5 颗星 = 几乎/精确到 0 颗星,表示与搜索不匹配,例如只有一个元素命中。但是,我得到的分数从 1.4 到 0.8660254 都返回了我会给 5 星的结果。我需要做的是以某种方式将这些结果转换为百分比,以便我可以用正确的星数标记这些结果。
我运行的得到 1.4 分的查询是:
euallowed:true AND(grade:"2:1")
给我 0.8660254 分数的查询是:
euallowed:true AND(grade:"2:1" OR grade:"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】:这称为归一化分数 (Scores As Percentages)。
您可以使用以下参数来实现:
ns = !funcproduct(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】:引用http://wiki.apache.org/lucene-java/ScoresAsPercentages:
人们经常希望根据 Lucene 分数计算“百分比”,以确定什么是“100% 完美”匹配与“50%”匹配。这也就是所谓的“归一化分数”
不要这样做。
说真的。停止尝试以这种方式思考你的问题,它不会有好的结局。
该页面确实提供了一个示例,说明您在理论上如何做到这一点,但这非常困难。
【讨论】:
嗯...谢谢你。这是一个很好的论点,但不确定当我覆盖 tf 和 idf 时会发生什么。我想我可能不得不以不同的方式看待这个问题。即使这意味着不按星级“评分”。【参考方案3】:我从来没有在 Solr 中做任何如此复杂的事情,所以可能有一种方法可以将它作为插件挂钩 - 但是当返回结果集时,您可以在客户端中处理它。如果您已按相关性排序,这应该是直截了当的 - 获取第一个结果(最大值)和最后一个结果(最小值)的相关性。然后对于每个相关度为x的结果,你可以计算
normalisedValue = (x - min) / (max - min)
这会给你一个介于 0 和 1 之间的值。乘以 5 并四舍五入得到星数。
【讨论】:
以上是关于如何标准化 solr/lucene 分数?的主要内容,如果未能解决你的问题,请参考以下文章
将 Z 分数(Z 值,标准分数)转换为 Python 中正态分布的 p 值