对于给定的查询 Q,包含关键词 $q_1$, …, $q_n$,那么对于文档 D 的 BM25 的得分:

\[score(D, Q) = \sum_{i=1}^n IDF(q_i) \cdot \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{\lvert D \rvert}{avgdl})}\]

其中:

$f(q_i, D) $ : 表示词 $q_i$ 出现在文档 D 中的次数

$ \lvert D \rvert$ : 表示文档 D 的长度,也就是包含字的个数

avgdl (average document length) : 表示一个文档集合中,文档的平均长度

$k_1$、$b$ : 常数。$k_1 \in \left [1.2, 2.0 \right] $,$b = 0.75$

$IDF(q_i)$ : 表示逆文档频率,表示查询词 $q_i$ 的权重。它的计算方式如下:

\[IDF(q_i) = \log \frac{N - n(q_i) + 0.5}{n(q_i) + 0.5}\]

$N$ : 表示集合中文档的总数

$n(q_i)$ : 表示包含关键词 $q_i$ 的文档个数

在 solr 中:

\[{ } tfNorm = \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1 \cdot (1 - b + b \cdot \frac{\lvert D \rvert}{avgdl})}\]

omitNorms="true" 时:avgdl = 1

\[tfNorm = \frac{f(q_i, D) \cdot (k_1 + 1)}{f(q_i, D) + k_1}\]