lucene默认得分在0到+无限之间吗?

时间:2015-07-24 12:51:46

标签: java lucene

我正在使用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则不行)。

有人知道吗?

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。

因此,只有负面提升会带来负面分数。评分算法中没有任何其他内容。