📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

此 API 用于获取 Easysearch 集群中支持的脚本语言信息。

API #

GET /_script_language

API 的作用 #

返回集群支持的脚本语言信息,包括:

  • types_allowed:集群允许的脚本类型(如 inline、stored)
  • language_contexts:每种脚本语言支持的使用上下文(如 score、update、aggs 等)

此 API 帮助开发者了解集群配置了哪些脚本语言,以及每种语言可以在哪些场景中使用。

API 的参数 #

此 API 没有路由参数和查询字符串参数。

请求示例 #

# 查询支持的脚本语言
GET /_script_language

响应示例 #

{
  "types_allowed": [
    "inline",
    "stored"
  ],
  "language_contexts": [
    {
      "language": "painless",
      "contexts": [
        "aggregation_selector",
        "aggs",
        "aggs_combine",
        "aggs_init",
        "aggs_map",
        "aggs_reduce",
        "boostrap",
        "bucket_sort",
        "canvas_expression",
        "category_read",
        "cluster_secret",
        "composite",
        "constant_score",
        "copy",
        "count_of",
        "date_histogram_interval",
        "delete",
        "distance_feature",
        "field",
        "filter",
        "freq_item_name",
        "freq_item_script",
        "function_score",
        "hide",
        "histogram",
        "histogram_interval",
        "histogram_sort",
        "inference",
        "inline",
        "items_script",
        "knn",
        "matrix_stats",
        "move",
        "must",
        "must_not",
        "number_of_slices",
        "operations",
        "parent_join",
        "partition",
        "pref",
        "prefix",
        "rank_feature",
        "rate_expressions",
        "regex",
        "rescore",
        "runtime",
        "runtime_field",
        "score",
        "search_lookup",
        "seq_no",
        "shard",
        "should",
        "sort",
        "string_stats",
        "template",
        "template_chunk",
        "terms_set",
        "update",
        "watcher_condition",
        "watcher_transform",
        "x_analytics_graph"
      ]
    },
    {
      "language": "expression",
      "contexts": [
        "aggs",
        "aggs_combine",
        "aggs_init",
        "aggs_map",
        "aggs_reduce",
        "bucket_sort",
        "constant_score",
        "distance_feature",
        "field",
        "function_score",
        "histogram_sort",
        "inline",
        "number_of_slices",
        "operations",
        "parent_join",
        "partition",
        "pref",
        "rank_feature",
        "score",
        "sort",
        "template",
        "update"
      ]
    },
    {
      "language": "mustache",
      "contexts": [
        "template",
        "template_chunk"
      ]
    }
  ]
}

响应字段说明 #

字段类型描述
types_allowedarray集群允许的脚本类型
language_contextsarray每种脚本语言及其支持的使用上下文
language_contexts.languagestring脚本语言名称
language_contexts.contextsarray该语言支持的使用上下文列表

脚本类型 (types_allowed) #

类型描述
inline内联脚本,直接在请求体中编写脚本代码
stored存储脚本,预先存储在集群中的脚本

常见脚本语言 #

Painless #

Easysearch 的默认和推荐脚本语言,具有以下特点:

  • 语法简洁,类似 Java
  • 类型安全
  • 性能优秀
  • 安全性高,有限制的访问权限
  • 支持最广泛的脚本上下文

Expression #

轻量级的表达式语言,用于简单计算:

  • 语法简洁
  • 性能极高
  • 功能有限,只支持基本运算
  • 适用于简单的数学和逻辑运算

Mustache #

模板语言,主要用于:

  • 搜索模板
  • 索引模板
  • 不用于计算脚本

常见脚本上下文 (contexts) #

上下文描述
score查询评分脚本
update文档更新脚本
filter过滤脚本
aggs / aggs_*聚合脚本
sort排序脚本
field / runtime_field字值脚本和运行时字段
function_score函数评分脚本
bucket_sort分桶排序脚本
template模板脚本

使用示例 #

查询支持的脚本语言 #

GET /_script_language

使用 Painless 内联脚本 #

POST /my-index/_update/1
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.counter += params.increment",
    "params": {
      "increment": 1
    }
  }
}

使用存储脚本 #

POST /my-index/_update/1
{
  "script": {
    "id": "my-stored-script",
    "params": {
      "increment": 1
    }
  }
}

使用 Expression 脚本 #

{
  "script_fields": {
    "test_field": {
      "script": {
        "lang": "expression",
        "source": "doc['price'].value * params.tax",
        "params": {
          "tax": 1.2
        }
      }
    }
  }
}

脚本语言选择建议 #

  1. Painless

    • 大多数脚本场景的首选
    • 需要复杂逻辑时使用
    • 需要访问文档字段时使用
  2. Expression

    • 简单数学运算
    • 对性能要求极高的场景
    • 只需要基本运算符的场景
  3. Mustache

    • 仅用于模板渲染
    • 不用于计算脚本

注意事项 #

  1. 此 API 只支持 GET 方法
  2. 不需要任何参数
  3. 脚本语言支持取决于集群配置
  4. 某些脚本语言可能需要插件支持
  5. 不同的脚本上下文可能支持不同的语言
  6. 生产环境中建议使用存储脚本而非内联脚本

安全性考虑 #

  1. 内联脚本:在生产环境可能被禁用,建议使用存储脚本
  2. 沙箱限制:Painless 运行在受限的沙箱环境中
  3. 权限控制:某些脚本操作需要特定权限

相关文档 #