在运行时字段中使用 Painless 脚本

编辑

在运行时字段中使用 Painless 脚本

编辑

运行时字段是在查询时评估的字段。当您定义一个运行时字段时,您可以立即在搜索请求、聚合、过滤和排序中使用它。

在定义运行时字段时,您可以包含一个在查询时评估的 Painless 脚本。此脚本可以访问文档的整个上下文,包括原始文档的 _source 字段 和任何映射字段及其值。在查询时,脚本会运行并为查询中包含的每个脚本化字段生成值。

您可以在映射定义的 runtime 部分下映射运行时字段,或定义仅作为搜索请求一部分存在的运行时字段。无论您在何处定义运行时字段,脚本语法都是相同的。

当定义要与运行时字段一起使用的 Painless 脚本时,您必须包含 emit 以返回计算值。

在映射中定义运行时字段

编辑

映射定义 下添加一个 runtime 部分,以便在不索引字段的情况下浏览数据。

以下请求中的脚本从 @timestamp 字段中提取星期几,该字段定义为 date 类型。脚本根据 @timestamp 的值计算星期几,并使用 emit 返回计算值。

PUT my-index/
{
  "mappings": {
    "runtime": {
      "day_of_week": {
        "type": "keyword",
        "script": {
          "source":
          """emit(doc['@timestamp'].value.dayOfWeekEnum
          .getDisplayName(TextStyle.FULL, Locale.ROOT))"""
        }
      }
    },
    "properties": {
      "@timestamp": {"type": "date"}
    }
  }
}

仅在搜索请求中定义运行时字段

编辑

在搜索请求中使用运行时字段以创建 仅作为查询一部分存在的字段。您还可以在查询时 覆盖现有字段的字段值,而无需修改字段本身。

这种灵活性使您可以在不重新索引数据的情况下试验数据模式并修复索引映射中的错误。

在以下请求中,day_of_week 字段的值是动态计算的,并且仅在此搜索请求的上下文中有效。

GET my-index/_search
{
  "runtime_mappings": {
    "day_of_week": {
      "type": "keyword",
      "script": {
        "source":
        """emit(doc['@timestamp'].value.dayOfWeekEnum
        .getDisplayName(TextStyle.FULL, Locale.ROOT))"""
      }
    }
  },
  "aggs": {
    "day_of_week": {
      "terms": {
        "field": "day_of_week"
      }
    }
  }
}