我正在使用lucene 5.2.1,我想实现自己的排名规则。为了制定正确的规则,我需要知道天气Lucene的默认相关性得分(通过普通搜索得到的那个)始终在0到+无限之间。
您可以在下面找到一个简单的代码,以获得更好的主意。
Query query = new Query(...); //some query, for example "name:foo"
int maxdocs = 500;
TopDocs topBusiness = searchEngine.search(query, maxdocs);
ScoreDoc[] hits = topBusiness.scoreDocs;
float score = hits[0].score;
我想确定变量得分不能低于0(例如得分= 0.00003就可以了,但得分= -1则不行)。
有人知道吗?
答案 0 :(得分:2)
搜索结果中的分数可能小于0!你真正需要做的就是设置一个负面的推动力来看它的实际效果(example demonstrating negative score)。
如果你可以轻松地假设你永远不必处理负面提升(我会说,通常是非常安全的)。那么你应该安全地假设所有得分同样是积极的。
要解释,得分是:
得分(q,d)=坐标(q,d)·queryNorm(q)·Σ(tf(t in d)·idf(t) 2 ·t.getBoost()·规范(t,d))
要得分为负,至少有一件事必须是否定的。
tf - 不能否定。术语不能在文档中出现-1次,因此术语频率必须为0或更高。
idf 2 - 这有点棘手。 idf是:
1 + log(numDocs /(docFreq + 1))
numDocs和docFreq都是积极的,因为否则我们会做出愚蠢的声明,比如我们的索引有负1个术语。所以,对数是一个正数,这是好的,因为谁想要处理想象的数字?
我们发现idf可能是正面的负面,但会是真实的(不是虚构的)。由于它在得分计算中被平方,所以我们再次得到保证的正数。 Wolfram Alpha might illustrate this better
coord - coord衡量可用查询字词与匹配查询字词的重叠。由于匹配的最少术语数为0,并且您不会使用少于零的术语进行查询,因此这将是正数。
queryNorm - 这个规范化因素可能是最难获得的,而且在实践中最不感兴趣:
1 /(q.getBoost() 2 ·Σ(idf(t)·t.getBoost()) 2 ) 1/2
出于我们的目的,我们可以看到,一切都变得平方,所以除非它是想象的,否则结果是积极的。提升不会是虚构的,我们在上面确定了idf不会是想象的,所以我们再次看到正数。
t.getBoost() - 这是负面得分出现在图片中的地方,但我们假设这对我们的目的是正面的。
规范 - 规范编码长度规范化,索引时间字段提升。我们假设积极推动,因此规范也将是积极的。这有点像学术。一些测试表明,默认的norm编码(长度只有一个字节)并不真正支持底片。任何编码和解码的负数都将出现0.0。
因此,只有负面提升会带来负面分数。评分算法中没有任何其他内容。