# 自定义打分函数

URL: https://caijiao.org/elasticsearch/03.advanced/13.script-scoring
Source: docs/elasticsearch/03.advanced/13.script-scoring.md
Description: 本章介绍 Elasticsearch 中自定义打分函数的实现方法和应用场景，帮助用户根据业务需求灵活调整文档评分。

自定义打分函数允许用户根据业务逻辑动态调整文档的相关性评分，超越默认算法，实现个性化排序。

## 1. 使用 Function Score 查询

`function_score` 查询结合原始查询结果与自定义函数，实现复杂评分策略。

### 示例：基于字段值加权

```json
GET /my-index/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "Elasticsearch 教程"
        }
      },
      "field_value_factor": {
        "field": "popularity",
        "factor": 1.5,
        "modifier": "sqrt",
        "missing": 1
      },
      "boost_mode": "multiply"
    }
  }
}
````

## 2. 结合脚本自定义评分

使用 Painless 脚本实现更复杂的打分逻辑。

```json
GET /my-index/_search
{
  "query": {
    "function_score": {
      "query": { "match_all": {} },
      "script_score": {
        "script": {
          "source": "doc['popularity'].value * 2 + doc['sales'].value"
        }
      }
    }
  }
}
```

## 3. 其他常用函数类型

* `random_score`：随机打分，用于打乱结果顺序
* `decay functions`：基于距离的权重衰减函数（如高斯衰减）
* `weight`：直接给查询加权重

## 4. 调优建议

* 根据业务需求设计评分函数，避免复杂脚本影响性能
* 使用缓存脚本提高效率
* 结合过滤器减少评分计算范围

---

自定义打分函数增强了搜索排序的灵活性，支持构建更精准的推荐和搜索体验。
