PutElasticsearchRecord Processor
描述
使用官方 Elastic REST 客户端库的记录感知 Elasticsearch put 处理器。 FlowFile 中的每条记录都会转换为要发送到 Elasticsearch _bulk APi 的文档。 可以将多个文档分批放入发送到 Elasticsearch 的每个请求中。 每个文档的批量操作都可以使用记录路径表达式进行配置。
标签
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| Index Operation | index | 用于索引的操作类型(创建、删除、索引、更新、更新插入) 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Index | | 要使用的索引的名称。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Type | | 该文档的类型(Elasticsearch 用于索引和搜索)。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Timestamp Value | | 用作 @timestamp 字段的值(Elasticsearch 数据流所需) 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Max JSON Field String Length | 20 MB | 解析 JSON 文档或属性时字符串值允许的最大长度。 | |
| Client Service | | 控制器服务 API:ElasticSearchClientServicecn.org.acal.lynxus-lynxus-elasticsearch-client-service-api-nar-2.11.8 | 用于运行查询的 Elasticsearch 客户端服务。 |
| Record Reader | | 控制器服务 API:RecordReaderFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 用于读取来自 FlowFiles 的传入记录的Record Reader。 |
| Batch Size | 100 | 在单个批次中发送的记录数。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| ID Record Path | | 用于获取与 Elasticsearch 一起使用的 ID 字段的记录路径表达式。如果留空,ID 将由 Elasticsearch 自动生成。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Retain Record Path ID Field | false | 是否保留现有字段作为ID记录路径。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Index Operation Record Path | | 用于获取与 Elasticsearch 一起使用的索引操作字段的记录路径表达式。如果留空,索引操作将使用主索引操作属性确定。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Index Record Path | | 用于获取与 Elasticsearch 一起使用的索引字段的记录路径表达式。如果留空,索引将使用主索引属性确定。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Type Record Path | | 用于获取与 Elasticsearch 一起使用的类型字段的记录路径表达式。如果留空,类型将使用主类型属性确定。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Timestamp Record Path | | 指向记录中包含文档 @timestamp 的字段的 RecordPath。如果留空,@timestamp 将使用主 @timestamp 属性确定 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Retain Record Timestamp | false | 是否保留用作@timestamp记录路径的现有字段。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Script Record Path | | 指向记录中包含文档更新/upsert 脚本的字段的 RecordPath。仅适用于更新/Upsert 操作。字段必须是 Map 类型兼容的(例如 Map 或 Record)或可解析为 JSON 对象的字符串 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Scripted Upsert Record Path | | 指向记录中包含 scripted_upsert 布尔标志的字段的 RecordPath。是否将 scripted_upsert 标志添加到 Upsert 操作中。强制 Elasticsearch 执行脚本,无论文档是否存在,默认为 false。如果提供的 Upsert 文档(来自 FlowFile 内容)为空,请确保将 Client Service Controller Service 的 Suppress Null and Empty Values 设置为 从不抑制,否则不会在发送到 Elasticsearch 的请求中包含 "upsert" 文档,该操作也不会为脚本创建要执行的新文档,导致 "not_found" 错误。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Dynamic Templates Record Path | | 指向记录中包含文档的 dynamic_templates 的字段的 RecordPath。字段必须是 Map 类型兼容(例如 Map 或 Record)或可解析为 JSON 对象的字符串。需要 Elasticsearch 7+ 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| 日期格式 | | 写入日期字段时使用的格式。如果未指定,则使用默认格式 'yyyy-MM-dd'。如果指定,值必须匹配 Java 简单日期格式(例如,MM/dd/yyyy 表示两位月份,后跟两位日期,后跟四位年份,全部以 '/' 字符分隔,如 01/25/2017)。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| 时间格式 | | 写入时间字段时使用的格式。如果未指定,则使用默认格式 'HH:mm:ss'。如果指定,值必须匹配 Java 简单日期格式(例如,HH:mm:ss 表示 24 小时制的两位小时,后跟两位分钟,后跟两位秒钟,全部以 ':' 字符分隔,如 18:04:15)。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| 时间戳格式 | | 写入时间戳字段时使用的格式。如果未指定,则使用默认格式 'yyyy-MM-dd HH:mm:ss'。如果指定,值必须匹配 Java 简单日期格式(例如,MM/dd/yyyy HH:mm:ss 表示两位月份,后跟两位日期,后跟四位年份,全部以 '/' 字符分隔;然后跟 24 小时制的两位小时,后跟两位分钟,后跟两位秒钟,全部以 ':' 字符分隔,如 01/25/2017 18:04:15)。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Log Error Responses | false |
| 如果启用此选项,错误将以错误日志级别记录到 Lynxus 日志中。否则,仅在 Lynxus 整体启用调试日志时才记录。此选项的目的是 |
| 输出错误响应 | false |
| 如果启用,来自 Elasticsearch 标记为 "error" 的响应消息将输出到 "error_responses" 关系。这不影响 FlowFile 输出到 "successful" 或 "errors" 关系。 |
| 结果记录写入器 | | 控制器服务 API:RecordSetWriterFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | Elasticsearch 的响应将检查失败的记录,失败的记录将使用此记录写入器服务写入记录集并发送到 "errors" 关系。成功的记录将使用此记录写入器服务写入记录集并发送到 "successful" 关系。 |
| 将未找到视为成功 | true |
| 如果为 true,与 "not_found" Elasticsearch 文档关联的记录将路由到 "successful" 关系,否则路由到 "errors" 关系。如果 输出错误响应 为 "true",则来自 Elasticsearch 的 "not_found" 响应将发送到 error_responses 关系。 |
| 按批量错误类型分组结果 | false |
| 写入到 "errors" 关系的错误记录将按错误类型分组,与 FlowFile 中第一条记录相关的错误将作为 "elasticsearch.bulk.error" 添加到 FlowFile。如果 "将未找到视为成功" 为 "false",则与 "not_found" Elasticsearch 文档响应关联的记录也将发送到 "errors" 关系。 |
动态属性
| 名称 | 值 | 描述 |
|---|---|---|
| Bulk 请求头的名称 | 用于检索 Bulk 请求头值的 Record Path 表达式 | 前缀:BULK: - 将指定的属性名称/值作为 Bulk 请求头添加到用于处理的 Elasticsearch Bulk API 请求体中。如果 Record Path 表达式结果为 null 或空值,则将为该文档操作省略 Bulk 请求头。这些参数将覆盖 _bulk 请求体中任何匹配的参数。 |
| HTTP 请求头的名称 | 用于检索 HTTP 请求头值的 Record Path 表达式 | 前缀:HEADER: - 将指定的属性名称/值作为 HTTP 请求头添加到 Elasticsearch 请求中。如果 Record Path 表达式结果为 null 或空值,则将省略该 HTTP 请求头。 |
| 要添加的 URL 查询参数的名称 | URL 查询参数的值 | 在用于处理的 Elasticsearch URL 中将指定的属性名称/值添加为查询参数。这些参数将覆盖 _bulk 请求体中任何匹配的参数 |
关系 (Relationships)
| 名称 | 描述 | 自动终止 |
|---|---|---|
errors | 对应于导致 Elasticsearch 错误的 Elasticsearch 文档的记录/FlowFile 将被路由到这里。 | 否 |
failure | 所有因与服务器可用性无关的原因而失败的 FlowFile 都会转至此关系。 | 否 |
original | 所有发送到 Elasticsearch 且没有请求失败的 FlowFile 都会转到此关系。 | 否 |
retry | 由于服务器/集群可用性而失败的所有 FlowFile 都会转至此关系。 | 否 |
successful | 对应于未导致 Elasticsearch 错误的 Elasticsearch 文档的记录/FlowFile 将被路由到这里。 | 否 |
写入的 FlowFile 属性
| 名称 | 描述 |
|---|---|
elasticsearch.put.error | 解析 FlowFile 记录、发送已解析文档到 Elasticsearch 或解析 Elasticsearch 响应时出现的错误消息 |
elasticsearch.put.error.count | 在 Elasticsearch _bulk API 中生成错误的记录数。 |
elasticsearch.put.success.count | Elasticsearch _bulk API 成功处理的记录数。 |
elasticsearch.bulk.error | 如果在 Elasticsearch 中处理记录期间出现错误,则 _bulk 响应。 |
状态管理
该组件不存储状态。
受限 (Restricted)
该组件不受限。
输入要求
该组件要求有传入连接。
系统资源考量
| 资源 | 描述 |
|---|---|
| MEMORY | 记录批次将存储在内存中,直到执行批量操作。 |
另请参阅
详细说明
PutElasticsearchRecord
该 Processor 用于访问 Elasticsearch Bulk API。它支持按每条记录 配置批量操作,这正是它与 PutElasticsearchJson 的区别。例如,可以 先定义多条索引文档的命令,然后按需对同一索引或其他索引执行 delete、create 和 update 操作。
作为 Elasticsearch REST API bundle 的一部分,它使用一个 Controller Service 管理连接信息,该 Controller Service 构建在 官方 Elasticsearch 客户端 API 之上,提供了诸如针对集群的自动 master 检测等其他 bundle 不具备的功能。
该 Processor 会为每个记录集构建一个 Elasticsearch Bulk API 请求体。应当注意把记录集拆分为大小合适的块,避免 Lynxus 耗尽 内存,同时确保发送给 Elasticsearch 的请求不会过大。发生失败时, 该 Processor 可以把失败的记录写入输出 record writer,使只有失败的 记录可以在下游处理或重放。
逐记录操作(Per-Record Actions)
index、operation 和(可选的)type 字段配置了默认值,可以通过 记录路径(record path)操作覆盖,从记录集中查找 index 或 type 值。 ID 和操作类型(create、index、update、upsert 或 delete)也可以 用类似方式从记录集中提取。"@timestamp" 字段可以使用默认值添加, 也可以从记录集中提取。当文档要索引到 Elasticsearch 数据流 (Data Stream)时,这会很有用。
示例 - 逐记录操作
以下示例文档演示了所有这些功能:
{
"metadata": {
"id": "12345",
"index": "test",
"type": "message",
"operation": "index"
},
"message": "Hello, world",
"from": "john.smith",
"ts": "2021-12-03'T'14:00:00.000Z"
}
{
"metadata": {
"id": "12345",
"index": "test",
"type": "message",
"operation": "delete"
}
}
下面的记录路径操作会提取相关数据:
- /metadata/id
- /metadata/index
- metadata/type
- metadata/operation
- /ts
动态模板(Dynamic Templates)
Index 和 Create 操作可以使用来自记录的动态模板,可以配置 记录路径操作从记录集中查找动态模板。记录中的动态模板 字段必须是 Map、子 Record,或者可解析为 JSON 对象的字符串。
示例 - 带动态模板的 Index
{
"message": "Hello, world",
"dynamic_templates": "{\"message\": \"keyword_lower\"}"
}
下面的记录路径操作会提取相关的动态模板:
- /dynamic_templates
会创建如下的 Elasticsearch action:
{
"index": {
"_id": "1",
"_index": "test",
"dynamic_templates": {
"message": "keyword_lower"
}
}
}
{
"doc": {
"message": "Hello, world"
}
}
Update/Upsert 脚本
Update 和 Upsert 操作可以使用来自记录的脚本,可以配置记录路径 操作从记录集中查找脚本。脚本必须包含 Elasticsearch 要求的所有 元素,例如 source 和 lang。记录中的脚本字段必须是 Map、子 Record,或者可解析为 JSON 对象的字符串。
如果为 upsert 定义了脚本,记录中剩余的字段会用作 Elasticsearch action 中的 upsert 字段。如果没有定义脚本, 所有记录字段都会用作 update 的 doc(对于 upsert 操作则为 doc_as_upsert)。
示例 - 不带脚本的 Update
{
"message": "Hello, world",
"from": "john.smith"
}
会创建如下的 Elasticsearch action:
{
"update": {
"_id": "1",
"_index": "test"
}
}
{
"doc": {
"message": "Hello, world",
"from": "john.smith"
}
}
示例 - 带脚本的 Upsert
{
"counter": 1,
"script": {
"source": "ctx._source.counter += params.param1",
"lang": "painless",
"params": {
"param1": 1
}
}
}
下面的记录路径操作会提取相关脚本:
- /script
会创建如下的 Elasticsearch action:
{
"update": {
"_id": "1",
"_index": "test"
}
}
{
"script": {
"source": "ctx._source.counter += params.param1",
"lang": "painless",
"params": {
"param1": 1
}
},
"upsert": {
"counter": 1
}
}
Bulk Action 头字段
可以在 Processor 上定义带 BULK: 前缀的动态属性。动态属性的 值是从记录集中查找字段值的记录路径操作。用户必须确保只向 Elasticsearch 发送与为该记录定义的索引操作相关的已知 Bulk action 字段,Elasticsearch 会拒绝索引操作与 Bulk action 字段的无效组合。
示例 - 带冲突重试的 Update
{
"message": "Hello, world",
"from": "john.smith",
"retry": 3
}
下面的动态属性和记录路径操作会提取相关字段:
- BULK:retry_on_conflict = /retry
会创建如下的 Elasticsearch action:
{
"update": {
"_id": "1",
"_index": "test",
"retry_on_conflict": 3
}
}
{
"doc": {
"message": "Hello, world",
"from": "john.smith"
}
}
Index 操作
"operation" 的有效值为:
- create
- delete
- index
- update