lucene 默认分数在 0 和 +infinite 之间吗?

Is lucene default score between 0 and +infinite?

我正在使用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;

我想确保变量 score 不能低于 0(例如 score=0.00003 可以,但 score=-1 则不行)。

有人知道吗?

搜索结果中的分数可能小于 0!您真正需要做的就是设置负提升以查看它的实际效果 (example demonstrating negative score)。


如果您可以轻松地假设您永远不必处理负增长(我会说,这通常是非常安全的)。那么你应该安全地假设所有分数同样都是积极的。

解释一下,分数是:

score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) )

要获得负分,至少其中一项必须是负分。

  • tf - 不能为负数。术语不能在文档中出现 -1 次,因此术语频率必须为 0 或更高。

  • idf2 - 这有点棘手。 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.

因此,只有负提升才会呈现负分。评分算法中的任何其他内容都不会。