摄取处理器上下文编辑

摄取处理器 中使用 Painless 脚本可以在插入时修改文档。

变量

params (Map,只读)
作为查询的一部分传入的用户定义参数。
ctx['_index'] (String)
索引的名称。
ctx (Map)
包含以 MapList 结构提取的 JSON,用于构成文档的字段。

副作用

ctx['_index']
修改此项可更改当前文档的目标索引。
ctx (Map)
修改 Map/List 结构中的值以添加、修改或删除文档的字段。

返回值

void
无预期返回值。

API

标准 Painless API专用摄取 API 均可用。

示例

要运行此示例,请先按照 上下文示例 中的步骤操作。

座位数据包含

  • 格式为 YYYY-MM-DD 的日期,其中月份和日期的第二位数字是可选的。
  • 格式为 HH:MM* 的时间,其中小时和分钟的第二位数字是可选的。星号 (*) 表示 String AMPM

以下摄取脚本处理日期和时间 String,并将结果存储在 datetime 字段中。

String[] dateSplit = ctx.date.splitOnToken("-");                     
String year = dateSplit[0].trim();
String month = dateSplit[1].trim();

if (month.length() == 1) {                                           
    month = "0" + month;
}

String day = dateSplit[2].trim();

if (day.length() == 1) {                                             
    day = "0" + day;
}

boolean pm = ctx.time.substring(ctx.time.length() - 2).equals("PM"); 
String[] timeSplit = ctx.time.substring(0,
        ctx.time.length() - 2).splitOnToken(":");                    
int hours = Integer.parseInt(timeSplit[0].trim());
int minutes = Integer.parseInt(timeSplit[1].trim());

if (pm) {                                                            
    hours += 12;
}

String dts = year + "-" + month + "-" + day + "T" +
        (hours < 10 ? "0" + hours : "" + hours) + ":" +
        (minutes < 10 ? "0" + minutes : "" + minutes) +
        ":00+08:00";                                                 

ZonedDateTime dt = ZonedDateTime.parse(
         dts, DateTimeFormatter.ISO_OFFSET_DATE_TIME);               
ctx.datetime = dt.getLong(ChronoField.INSTANT_SECONDS)*1000L;        

使用 splitOnToken 函数将座位数据中的日期 String 分隔成年份、月份和日期 String

注意
  • 使用 ctx 摄取处理器上下文变量从 date 字段检索数据。

由于座位数据的格式允许这种情况,因此将 字符串字面量 "0" 值附加到一位数月份。

由于座位数据的格式允许这种情况,因此将 字符串字面量 "0" 值附加到一位数日期。

如果时间 String 是下午或晚上的时间,则将 boolean 类型 变量 设置为 true

注意
  • 使用 ctx 摄取处理器上下文变量从 time 字段检索数据。

使用 splitOnToken 函数将座位数据中的时间 String 分隔成小时和分钟 String

注意
  • 使用 substring 方法删除时间 String 中的 AMPM 部分。
  • 使用 ctx 摄取处理器上下文变量从 date 字段检索数据。

如果时间 String 是下午或晚上的值,则将 整数字面量 12 添加到现有小时数中,以转换为基于 24 小时制的时间。

构建一个可以使用现有 API 方法解析的新时间 String

通过使用 API 方法 parse 解析新时间 String 来创建 ZonedDateTime 引用类型 值。

将 datetime 字段 datetime 设置为从 API 方法 getLong 检索到的毫秒数。

注意
  • 使用 ctx 摄取处理器上下文变量设置字段 datetime。在索引每个文档时,使用 ctx 变量操作每个文档的字段。

提交以下请求

PUT /_ingest/pipeline/seats
{
  "description": "update datetime for seats",
  "processors": [
    {
      "script": {
        "source": "String[] dateSplit = ctx.date.splitOnToken('-'); String year = dateSplit[0].trim(); String month = dateSplit[1].trim(); if (month.length() == 1) { month = '0' + month; } String day = dateSplit[2].trim(); if (day.length() == 1) { day = '0' + day; } boolean pm = ctx.time.substring(ctx.time.length() - 2).equals('PM'); String[] timeSplit = ctx.time.substring(0, ctx.time.length() - 2).splitOnToken(':'); int hours = Integer.parseInt(timeSplit[0].trim()); int minutes = Integer.parseInt(timeSplit[1].trim()); if (pm) { hours += 12; } String dts = year + '-' + month + '-' + day + 'T' + (hours < 10 ? '0' + hours : '' + hours) + ':' + (minutes < 10 ? '0' + minutes : '' + minutes) + ':00+08:00'; ZonedDateTime dt = ZonedDateTime.parse(dts, DateTimeFormatter.ISO_OFFSET_DATE_TIME); ctx.datetime = dt.getLong(ChronoField.INSTANT_SECONDS)*1000L;"
      }
    }
  ]
}