Painless 脚本基础
本章定位:当 BM25 不能满足排序需求时,Painless 脚本让你用代码干预评分和字段计算。它是 function_score 和 script_score 的执行引擎。
定义与作用
Painless 是 Elasticsearch 内置的安全脚本语言,语法类似 Java,支持在搜索(script_score)、更新(ctx._source)、聚合(scripted metric)和 Ingest Pipeline 中使用。
解决的痛点:标准评分无法表达业务逻辑(如"评分=BM25 × 销量权重"),Painless 脚本让你自定义计算。
完整示例:小崔的自定义评分
POST /courses/_search
{
"query": {
"script_score": {
"query": { "match": { "title": "Python" } },
"script": {
"source": """
double score = _score;
double rating = doc['rating'].value;
double enrollment = Math.log1p(doc['enrollment_count'].value);
return score * (rating * 0.6 + enrollment * 0.4);
"""
}
}
}
}
Update 中使用
POST /students/_update/1
{
"script": {
"source": "ctx._source.score += params.increment",
"params": { "increment": 5 }
}
}
小结
Painless 三使用场景:script_score(自定义评分)、update(字段计算)、aggregation(脚本聚合)。注意避免大量文档脚本计算(性能杀手),优先用 field_value_factor。