# TF/IDF 与 BM25

URL: https://caijiao.org/elasticsearch/03.advanced/06.scoring-bm25
Source: docs/elasticsearch/03.advanced/06.scoring-bm25.md
Description: 本章深入讲解 Elasticsearch 中经典的 TF/IDF 及 BM25 打分模型，比较两者特点及应用，助力优化搜索相关性。

Elasticsearch 在评分文档相关性时，主要依赖两种算法：经典的 TF/IDF（词频-逆文档频率）模型和改进的 BM25 模型。理解它们的原理有助于调优搜索效果。

## 1. TF/IDF 模型

- **TF（Term Frequency）**：词项在文档中的出现频率，频率越高相关性越强  
- **IDF（Inverse Document Frequency）**：词项在整个文档库中的逆文档频率，出现越少权重越高  
- 计算公式（简化）：

$$
\text{score}(q,d) = \sum_{t \in q} tf(t,d) \times idf(t)
$$

- 缺点：对文档长度敏感，长文档可能得分偏低

## 2. BM25 模型

BM25 是 TF/IDF 的改进版本，考虑了文档长度归一化和词频饱和效应。

### 计算公式

$$
\text{score}(q,d) = \sum_{t \in q} IDF(t) \cdot \frac{tf(t,d) \cdot (k_1 + 1)}{tf(t,d) + k_1 \cdot (1 - b + b \cdot \frac{|d|}{avgdl})}
$$

- \( k_1 \)：词频调节参数（通常为 1.2）  
- \( b \)：文档长度归一化参数（通常为 0.75）  
- \( |d| \)：文档长度  
- \( avgdl \)：平均文档长度

### 优势

- 减少了长文档得分过低的问题  
- 更符合自然语言处理实际需求  
- 是 Elasticsearch 默认的评分算法

## 3. 实际应用

Elasticsearch 默认使用 BM25，但可以通过配置切换到 TF/IDF。

示例切换评分算法：

```json
PUT /my-index/_settings
{
  "index": {
    "similarity": {
      "default": {
        "type": "classic"
      }
    }
  }
}
````

`classic` 即为 TF/IDF 算法。

---

深入理解 TF/IDF 与 BM25，有助于根据具体场景优化搜索相关性和用户体验。
