在运行时字段中使用 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"
      }
    }
  }
}