了解 Apache Lucene 的评分算法
Understanding Apache Lucene's scoring algorithm
我已经使用 Hibernate Search 几个月了,但我仍然无法理解它带来的相关性。我对它的结果总体上很满意 returns,但即使是最简单的测试也不符合我的期望。
第一个测试是使用术语频率 (tf)。
数据:
- 字数
- 字字
- 字字字字
- 一个字一个字一个字
- 单词单词单词单词单词单词
- 一个字一个字字一个字字一个字
我得到的结果:
- 字数
- 一个字一个字一个字
- 字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字码38
- 单词word Word Word
- 单词单词
- 字字字字
我真的很困惑这种得分效果。我的Query比较复杂,但是由于这个测试没有涉及任何其他字段,所以可以简化如下:
booleanjunction.should(phraseQuery).should(keywordQuery).should(fuzzyQuery)
我有如下分析器:
StandardFilterFactory
LowerCaseFilterFactory
StopFilterFactory
SnowballPorterFilterFactory for english
评分计算真的很复杂。在这里,您必须以 the primal equation:
开头
score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) ·
idf(t)2 · t.getBoost() · norm(t,d) )
正如你所说,你有 tf
表示词频,它的值是词频的平方根。
但是在这里,正如您在 your explanation 中看到的,您还有 norm
(又名 fieldNorm
)用于 fieldWeight
计算。让我们举个例子:
eklavya eklavya eklavya eklavya eklavya
4.296241 = fieldWeight in 177, product of:
2.236068 = tf(freq=5.0), with freq of:
5.0 = termFreq=5.0
4.391628 = idf(docFreq=6, maxDocs=208)
0.4375 = fieldNorm(doc=177)
eklavya
4.391628 = fieldWeight in 170, product of:
1.0 = tf(freq=1.0), with freq of:
1.0 = termFreq=1.0
4.391628 = idf(docFreq=6, maxDocs=208)
1.0 = fieldNorm(doc=170)
在这里,eklavya
比另一个得分更高,因为 fieldWeight
是 tf
、idf
和 fieldNorm
的乘积。这最后一个对于 eklavya
文档来说更高,因为他只包含一个术语。
如上文所述:
lengthNorm - computed when the document is added to the index in
accordance with the number of tokens of this field in the document, so
that shorter fields contribute more to the score.
字段中的术语越多,fieldNorm
就会越低。
小心 value of this field.
因此,总而言之,在这里您有一个完美的组合,可以理解得分不仅是根据频率计算的,而且还与您所在领域的术语数有关。
我已经使用 Hibernate Search 几个月了,但我仍然无法理解它带来的相关性。我对它的结果总体上很满意 returns,但即使是最简单的测试也不符合我的期望。
第一个测试是使用术语频率 (tf)。 数据:
- 字数
- 字字
- 字字字字
- 一个字一个字一个字
- 单词单词单词单词单词单词
- 一个字一个字字一个字字一个字
我得到的结果:
- 字数
- 一个字一个字一个字
- 字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字字码38
- 单词word Word Word
- 单词单词
- 字字字字
我真的很困惑这种得分效果。我的Query比较复杂,但是由于这个测试没有涉及任何其他字段,所以可以简化如下: booleanjunction.should(phraseQuery).should(keywordQuery).should(fuzzyQuery)
我有如下分析器:
StandardFilterFactory
LowerCaseFilterFactory
StopFilterFactory
SnowballPorterFilterFactory for english
评分计算真的很复杂。在这里,您必须以 the primal equation:
开头score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) )
正如你所说,你有 tf
表示词频,它的值是词频的平方根。
但是在这里,正如您在 your explanation 中看到的,您还有 norm
(又名 fieldNorm
)用于 fieldWeight
计算。让我们举个例子:
eklavya eklavya eklavya eklavya eklavya
4.296241 = fieldWeight in 177, product of:
2.236068 = tf(freq=5.0), with freq of:
5.0 = termFreq=5.0
4.391628 = idf(docFreq=6, maxDocs=208)
0.4375 = fieldNorm(doc=177)
eklavya
4.391628 = fieldWeight in 170, product of:
1.0 = tf(freq=1.0), with freq of:
1.0 = termFreq=1.0
4.391628 = idf(docFreq=6, maxDocs=208)
1.0 = fieldNorm(doc=170)
在这里,eklavya
比另一个得分更高,因为 fieldWeight
是 tf
、idf
和 fieldNorm
的乘积。这最后一个对于 eklavya
文档来说更高,因为他只包含一个术语。
如上文所述:
lengthNorm - computed when the document is added to the index in accordance with the number of tokens of this field in the document, so that shorter fields contribute more to the score.
字段中的术语越多,fieldNorm
就会越低。
小心 value of this field.
因此,总而言之,在这里您有一个完美的组合,可以理解得分不仅是根据频率计算的,而且还与您所在领域的术语数有关。