摄取处理器上下文
编辑摄取处理器上下文编辑
在 摄取处理器 中使用 Painless 脚本可以在插入时修改文档。
变量
-
params
(Map
,只读) - 作为查询的一部分传入的用户定义参数。
-
ctx['_index']
(String
) - 索引的名称。
-
ctx
(Map
) - 包含以
Map
和List
结构提取的 JSON,用于构成文档的字段。
副作用
-
ctx['_index']
- 修改此项可更改当前文档的目标索引。
-
ctx
(Map
) - 修改
Map/List
结构中的值以添加、修改或删除文档的字段。
返回值
- void
- 无预期返回值。
API
标准 Painless API 和 专用摄取 API 均可用。
示例
要运行此示例,请先按照 上下文示例 中的步骤操作。
座位数据包含
- 格式为
YYYY-MM-DD
的日期,其中月份和日期的第二位数字是可选的。 - 格式为 HH:MM* 的时间,其中小时和分钟的第二位数字是可选的。星号 (*) 表示
String
AM
或PM
。
以下摄取脚本处理日期和时间 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;
使用
|
|
由于座位数据的格式允许这种情况,因此将 字符串字面量 |
|
由于座位数据的格式允许这种情况,因此将 字符串字面量 |
|
如果时间
|
|
使用
|
|
如果时间 |
|
构建一个可以使用现有 API 方法解析的新时间 |
|
通过使用 API 方法 |
|
将 datetime 字段
|
提交以下请求
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;" } } ] }