摄取处理器上下文

编辑

摄取处理器 中使用 Painless 脚本,以便在插入文档时对其进行修改。

变量

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

副作用

ctx['_index']
修改此项可更改当前文档的目标索引。
ctxMap
修改 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 方法删除时间 StringAMPM 部分。
  • 使用 ctx 摄取处理器上下文变量从 date 字段检索数据。

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

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

通过使用 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;"
      }
    }
  ]
}