PutElasticsearchJson Processor
描述
使用官方 Elastic REST 客户端库将 JSON 数据写入 Elasticsearch 的 put 处理器。
标签
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| Index Operation | index | 用于索引的操作类型(创建、删除、索引、更新、更新插入) 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Index | | 要使用的索引的名称。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Type | | 该文档的类型(Elasticsearch 用于索引和搜索)。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| 脚本 | | 文档更新/upsert 的脚本。仅适用于 Update/Upsert 操作。必须可解析为 JSON 对象。如果留空,将使用 FlowFile 内容进行文档更新/upsert 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| 脚本化 Upsert | false | 是否将 scripted_upsert 标志添加到 Upsert 操作。如果为 true,强制 Elasticsearch 执行脚本,无论文档是否存在,默认为 false。如果 upsert 文档将为空,请确保禁用空值抑制,以便在请求中包含空的 "upsert" 文档——否则 Elasticsearch 不会为脚本创建新文档来执行,导致 "not_found" 错误。对于单 JSON 模式,设置 Client Service 控制器服务的 Suppress Null and Empty Values 为 从不抑制。对于 NDJSON 和 JSON 数组模式,将此处理器上的 Suppress Nulls 属性设置为 Never Suppress。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Dynamic Templates | | 文档的dynamic_templates。 必须可解析为 JSON 对象。 需要 Elasticsearch 7+ 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Input Content Format | Single JSON |
| 每个 FlowFile 中 JSON 内容的格式。\ NDJSON:每行一个 JSON 对象(换行分隔)。\ JSON Array:顶层 JSON 对象数组,逐元素流式传输以提高内存效率。\ Single JSON:整个 FlowFile 是单个 JSON 文档。\ |
| 每批最大 FlowFile 数 | 100 | 标记为「error」的 Elasticsearch _bulk API 响应转到此处(当「将「未找到」视为成功」为「true」时,还可选包括「not_found」)。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Max Batch Size | 10 MB | 单个 Elasticsearch _bulk API 请求中发送的最大数据量。对于 NDJSON 和 JSON Array 模式,FlowFile 会累积直到达到此阈值,然后刷新。对于 Single JSON 模式,这作为基于大小的安全限制:如果累积的 FlowFile 在达到每批最大 FlowFile 数之前超过此大小,请求会提前刷新。Elasticsearch 建议每个批量请求 5-15 MB 以获得最佳性能。要禁用基于大小的限制,请勾选“设置空字符串”。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Suppress Nulls | never-suppress |
| 当设置为 Always Suppress 时,null 和空值在发送到 Elasticsearch 之前从文档中移除。此设置仅适用于 Index 和 Create 操作的 NDJSON 和 JSON Array 格式。\ 对于 Single JSON,请在控制器服务上配置 null 抑制。性能说明:对于 JSON Array,影响可以忽略不计,因为文档已经在被解析。\ 对于 NDJSON,当启用抑制时,每行必须被解析和重新序列化,\ 与默认行为(将行作为原始字节传递)相比,这会增加开销。\ |
| Identifier Attribute | | 包含文档标识符的 FlowFile 属性的名称。如果索引操作为 "index",此属性可以留空或计算为空值,在这种情况下文档的标识符将由 Elasticsearch 自动生成。对于所有其他索引操作,属性必须计算为非空值。 | |
| Field Path Mode | Literal Field Name |
| 在每个文档中查找字段时,如何解释“标识符字段”、“索引字段”和“时间戳字段”属性值。在“字面字段名称”模式(默认)下,每个值是顶层字段的精确名称。在“嵌套字段路径”模式下,每个值是进入嵌套对象的“/”分隔路径;参见处理器的“附加详情”了解完整的路径语法,包括如何引用包含字面“/”的字段名。 |
| Identifier Field | | 每个文档中用作 Elasticsearch 文档 ID 的字段名称,根据“字段路径模式”属性解释为字面字段名或嵌套的“/”分隔路径。如果字段在文档中不存在或此属性留空,则不设置文档 ID,Elasticsearch 将自动生成一个。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Retain Identifier Field | true |
| 在提取标识符字段用作 Elasticsearch 文档 ID 后,是否保留在文档体中。当为 true(默认)时,字段保留在文档中;设置为 false 可在索引前移除它。对于嵌套的(“/”分隔)路径,因移除而留空的任何父对象也会被修剪。 |
| Index Field | | 每个文档中用作 Elasticsearch 索引名称的字段名称,根据“字段路径模式”属性解释为字面字段名或嵌套的“/”分隔路径。如果字段在文档中不存在或此属性留空,则使用配置的 Index 属性值作为回退。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Retain Index Field | true |
| 在提取索引字段用作 Elasticsearch 索引名称后,是否保留在文档体中。当为 true(默认)时,字段保留在文档中;设置为 false 可在索引前移除它。对于嵌套的(“/”分隔)路径,因移除而留空的任何父对象也会被修剪。 |
| Timestamp Field | | 每个文档中其值将作为 @timestamp 字段写入 Elasticsearch 的字段名称,根据“字段路径模式”属性解释为字面字段名或嵌套的“/”分隔路径。如果字段不存在或此属性留空,则不设置 @timestamp。 支持表达式语言:是(仅使用环境/系统变量求值) | |
| Retain Timestamp Field | true |
| 在将时间戳字段的值复制到 @timestamp 后,是否保留在文档体中。当为 true(默认)时,字段保留在文档中;设置为 false 可在索引前移除它。对于嵌套的(“/”分隔)路径,因移除而留空的任何父对象也会被修剪。 |
| Character Set | UTF-8 | 指定文档数据的字符集。 支持表达式语言:是(使用 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 客户端服务。 |
| Log Error Responses | false |
| 如果启用此选项,错误将以错误日志级别记录到 Lynxus 日志中。否则,仅在 Lynxus 整体启用调试日志时才记录。此选项的目的是 |
| 输出错误响应 | false |
| 如果启用,来自 Elasticsearch 标记为 "error" 的响应消息将输出到 "error_responses" 关系。这不影响 FlowFile 输出到 "successful" 或 "errors" 关系。 |
| 输出批量请求 | false |
| 如果启用,每个 Elasticsearch _bulk 请求体将作为 FlowFile 写入到 "bulk_request" 关系。用于调试。每个 FlowFile 包含与发送到 Elasticsearch 完全相同的完整 NDJSON 请求体。 |
| 将未找到视为成功 | true |
| 如果为 true,与 "not_found" Elasticsearch 文档关联的记录将路由到 "successful" 关系,否则路由到 "errors" 关系。如果 输出错误响应 为 "true",则来自 Elasticsearch 的 "not_found" 响应将发送到 error_responses 关系。 |
动态属性
| 名称 | 值 | 描述 |
|---|---|---|
| Bulk 请求头的名称 | Bulk 请求头的值 | 前缀:BULK: - 将指定的属性名称/值作为 Bulk 请求头添加到用于处理的 Elasticsearch Bulk API 请求体中。如果值为 null 或空,则将为该文档操作省略 Bulk 请求头。这些参数将覆盖 _bulk 请求体中任何匹配的参数。 |
| HTTP 请求头的名称 | 用于检索 HTTP 请求头值的 Record Path 表达式 | 前缀:HEADER: - 将指定的属性名称/值作为 HTTP 请求头添加到 Elasticsearch 请求中。如果 Record Path 表达式结果为 null 或空值,则将省略该 HTTP 请求头。如果 FlowFile 被批处理,则仅使用批中的第一个 FlowFile 来评估属性值。 |
| 要添加的 URL 查询参数的名称 | URL 查询参数的值 | 在用于处理的 Elasticsearch URL 中将指定的属性名称/值添加为查询参数。这些参数将覆盖 _bulk 请求体中任何匹配的参数。如果 FlowFile 被批处理,则仅使用批中的第一个 FlowFile 来评估属性值。 |
关系 (Relationships)
| 名称 | 描述 | 自动终止 |
|---|---|---|
errors | 对应于导致 Elasticsearch 错误的 Elasticsearch 文档的记录/FlowFile 将被路由到这里。 | 否 |
failure | 所有因与服务器可用性无关的原因而失败的 FlowFile 都会转至此关系。 | 否 |
original | 所有发送到 Elasticsearch 且没有请求失败的 FlowFile 都会转到此关系。 | 否 |
retry | 由于服务器/集群可用性而失败的所有 FlowFile 都会转至此关系。 | 否 |
successful | 对应于未导致 Elasticsearch 错误的 Elasticsearch 文档的记录/FlowFile 将被路由到这里。 | 否 |
写入的 FlowFile 属性
| 名称 | 描述 |
|---|---|
elasticsearch.put.error | 如果解析 FlowFile、将解析后的文档发送到 Elasticsearch 或解析 Elasticsearch 响应时出现问题,则显示错误消息 |
elasticsearch.bulk.error | 如果在 Elasticsearch 中处理文档期间出现错误,则 _bulk 响应。 |
状态管理
该组件不存储状态。
受限 (Restricted)
该组件不受限。
输入要求
该组件要求有传入连接。
系统资源考量
| 资源 | 描述 |
|---|---|
| MEMORY | 一次最多缓冲一批数据的量。最大内存使用量由 Max Batch Size 属性限制。 |
详细说明
PutElasticsearchJson
该 Processor 用于访问 Elasticsearch Bulk API。它支持按每个 FlowFile 配置批量操作,这正是它与 PutElasticsearchRecord 的区别。
作为 Elasticsearch REST API bundle 的一部分,它使用一个 Controller Service 管理连接信息,该 Controller Service 构建在 官方 Elasticsearch 客户端 API 之上,提供了诸如针对集群的自动 master 检测等其他 bundle 不具备的功能。
该 Processor 会为每(批)个 FlowFile 构建一个 Elasticsearch Bulk API 请求体。应当注意把 FlowFile 批量为大小合适的块,避免 Lynxus 耗尽内存,同时确保发送给 Elasticsearch 的请求不会过大。 发生失败时,该 Processor 可以把失败的 FlowFile 路由到错误队列, 使只有失败的 FlowFile 可以在下游处理或重放。
index、operation 和(可选的)type 字段配置了默认值。ID(当 operation 为 "index" 时可选)可以设置为 FlowFile 的 Attribute。
字段路径模式(Field Path Mode)
Identifier Field、Index Field 和 Timestamp Field 属性
各自命名一个文档中的字段,其值会被提取(分别用作文档 ID、索引名
或 @timestamp)。Field Path Mode 属性控制这些值的解释方式:
- Literal Field Name(默认)— 每个值都是顶层字段的确切名称。
/或\只是字段名中的普通字符,因此像@metadata/id这样的值 匹配名称恰好为@metadata/id的顶层字段。 - Nested Field Path — 每个值是以
/分隔的嵌套对象路径, 如下所述。
Literal Field Name(默认)
对于文档:
{
"@metadata/id": "abc",
"message": "Hello, world"
}
Identifier Field 为 @metadata/id 会选中 abc — 即名称恰好为
@metadata/id 的顶层字段。同样的值对于 {"@metadata": {"id": "abc"}}
不会选中任何内容,因为不存在名称恰好为该值的顶层字段。
Nested Field Path
本节其余部分适用于 Field Path Mode 设为 Nested Field Path 的情况。对于文档:
{
"@metadata": {
"id": "abc",
"index": "my-index"
},
"message": "Hello, world"
}
- Identifier Field 路径
@metadata/id选中abc - Index Field 路径
@metadata/index选中my-index
名称中包含斜杠的字段
由于 / 分隔路径段,名称中确实包含 / 的字段必须把该斜杠转义为
\/,字面反斜杠必须转义为 \\。例如,对于文档
{"a/b": "abc"},路径 a\/b 选中名为 a/b 的顶层字段。
移除与裁剪
当对应的 Retain 属性设为 false 时,字段在提取值之后会从
文档正文中移除。对于嵌套路径,因移除而变空的父对象也会被裁剪。
例如,从 {"@metadata": {"id": "abc"}, "message": "Hello, world"}
中提取并移除 @metadata/id 后,剩下 {"message": "Hello, world"},
已为空的 @metadata 对象被移除。
动态模板(Dynamic Templates)
Index 和 Create 操作可以使用动态模板。Dynamic Templates 属性 必须可解析为 JSON 对象。
示例 - 带动态模板的 Index
{
"message": "Hello, world"
}
下面的 Dynamic Templates 属性可解析:
{
"message": "keyword_lower"
}
会创建如下的 Elasticsearch action:
{
"index": {
"_id": "1",
"_index": "test",
"dynamic_templates": {
"message": "keyword_lower"
}
}
}
{
"doc": {
"message": "Hello, world"
}
}
Update/Upsert 脚本
Update 和 Upsert 操作可以使用脚本。脚本必须包含 Elasticsearch 要求的所有元素,例如 source 和 lang。Script 属性必须可解析为 JSON 对象。
如果为 upsert 定义了脚本,FlowFile 内容会用作 Elasticsearch action 中的 upsert 字段。如果没有定义脚本,FlowFile 内容会用作 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
}
}
会创建如下的 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 发送与为该 FlowFile 定义的索引操作相关的已知 Bulk action 字段,Elasticsearch 会拒绝索引操作与 Bulk action 字段的无效组合。
示例 - 带冲突重试的 Update
{
"message": "Hello, world",
"from": "john.smith"
}
使用下面的动态属性:
- BULK:retry_on_conflict = 3
会创建如下的 Elasticsearch action:
{
"update": {
"_id": "1",
"_index": "test",
"retry_on_conflict": "3"
}
}
{
"doc": {
"message": "Hello, world",
"from": "john.smith"
}
}
Index 操作
"operation" 的有效值为:
- create
- delete
- index
- update