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

编辑

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

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

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

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

定义用于运行时字段的 Painless 脚本时,必须包含 emit 以返回计算的值。

在映射中定义运行时字段编辑

映射定义 下添加一个 runtime 部分,以探索您的数据,而无需索引字段。

以下请求中的脚本从定义为 date 类型的 @timestamp 字段中提取星期几。该脚本根据 @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"
      }
    }
  }
}