PutElasticsearchJson

文档中心 › 组件索引 › PutElasticsearchJson

PutElasticsearchJson Processor

类型全限定名:cn.org.acal.lynxus.processors.elasticsearch.PutElasticsearchJson

所属 Bundle:cn.org.acal.lynxus:lynxus-elasticsearch-restapi-nar:2.11.8

描述

使用官方 Elastic REST 客户端库将 JSON 数据写入 Elasticsearch 的 put 处理器。

标签

ndjsonjsonjson arrayelasticsearchelasticsearch7elasticsearch8elasticsearch9putindex

属性

下表中,加粗的属性为必填项;其余为可选项。表格同时标注默认值、是否支持表达式语言,以及是否为敏感属性(值会被加密)。

名称默认值可选值描述
Index Operationindex用于索引的操作类型(创建、删除、索引、更新、更新插入)
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Index要使用的索引的名称。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Type该文档的类型(Elasticsearch 用于索引和搜索)。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
脚本文档更新/upsert 的脚本。仅适用于 Update/Upsert 操作。必须可解析为 JSON 对象。如果留空,将使用 FlowFile 内容进行文档更新/upsert
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
脚本化 Upsertfalse是否将 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 FormatSingle JSON
  • NDJSON — 每行一个 JSON 对象(以换行符分隔)。
  • JSON Array — 顶层的 JSON 对象数组,为提升内存效率而逐元素流式处理。
  • Single JSON — 整个 FlowFile 是单个 JSON 文档。
每个 FlowFile 中 JSON 内容的格式。\ NDJSON:每行一个 JSON 对象(换行分隔)。\ JSON Array:顶层 JSON 对象数组,逐元素流式传输以提高内存效率。\ Single JSON:整个 FlowFile 是单个 JSON 文档。\
每批最大 FlowFile 数100标记为「error」的 Elasticsearch _bulk API 响应转到此处(当「将「未找到」视为成功」为「true」时,还可选包括「not_found」)。
支持表达式语言:是(仅使用环境/系统变量求值)
Max Batch Size10 MB单个 Elasticsearch _bulk API 请求中发送的最大数据量。对于 NDJSON 和 JSON Array 模式,FlowFile 会累积直到达到此阈值,然后刷新。对于 Single JSON 模式,这作为基于大小的安全限制:如果累积的 FlowFile 在达到每批最大 FlowFile 数之前超过此大小,请求会提前刷新。Elasticsearch 建议每个批量请求 5-15 MB 以获得最佳性能。要禁用基于大小的限制,请勾选“设置空字符串”。
支持表达式语言:是(仅使用环境/系统变量求值)
Suppress Nullsnever-suppress
  • 从不抑制 — 缺失(在 Schema 中定义但不在记录中)或值为 null/空的字段将作为 null/空值写出
  • 始终抑制 — 缺失(在 Schema 中定义但不在记录中)或值为 null/空的字段将不会写出
当设置为 Always Suppress 时,null 和空值在发送到 Elasticsearch 之前从文档中移除。此设置仅适用于 Index 和 Create 操作的 NDJSON 和 JSON Array 格式。\ 对于 Single JSON,请在控制器服务上配置 null 抑制。性能说明:对于 JSON Array,影响可以忽略不计,因为文档已经在被解析。\ 对于 NDJSON,当启用抑制时,每行必须被解析和重新序列化,\ 与默认行为(将行作为原始字节传递)相比,这会增加开销。\
Identifier Attribute包含文档标识符的 FlowFile 属性的名称。如果索引操作为 "index",此属性可以留空或计算为空值,在这种情况下文档的标识符将由 Elasticsearch 自动生成。对于所有其他索引操作,属性必须计算为非空值。
Field Path ModeLiteral Field Name
  • Literal Field Name — 配置的值是文档中某个顶层字段的确切名称;"/" 和 "\" 被视为字面字符。这是默认设置,与早期版本的行为一致。
  • Nested Field Path — 配置的值是以 "/" 分隔的、指向嵌套对象的路径(例如 "@metadata/id")。 要引用包含字面 "/" 的字段名,请将其转义为 "\/";字面反斜杠为 "\\"。
在每个文档中查找字段时,如何解释“标识符字段”、“索引字段”和“时间戳字段”属性值。在“字面字段名称”模式(默认)下,每个值是顶层字段的精确名称。在“嵌套字段路径”模式下,每个值是进入嵌套对象的“/”分隔路径;参见处理器的“附加详情”了解完整的路径语法,包括如何引用包含字面“/”的字段名。
Identifier Field每个文档中用作 Elasticsearch 文档 ID 的字段名称,根据“字段路径模式”属性解释为字面字段名或嵌套的“/”分隔路径。如果字段在文档中不存在或此属性留空,则不设置文档 ID,Elasticsearch 将自动生成一个。
支持表达式语言:是(仅使用环境/系统变量求值)
Retain Identifier Fieldtrue
  • true
  • false
在提取标识符字段用作 Elasticsearch 文档 ID 后,是否保留在文档体中。当为 true(默认)时,字段保留在文档中;设置为 false 可在索引前移除它。对于嵌套的(“/”分隔)路径,因移除而留空的任何父对象也会被修剪。
Index Field每个文档中用作 Elasticsearch 索引名称的字段名称,根据“字段路径模式”属性解释为字面字段名或嵌套的“/”分隔路径。如果字段在文档中不存在或此属性留空,则使用配置的 Index 属性值作为回退。
支持表达式语言:是(仅使用环境/系统变量求值)
Retain Index Fieldtrue
  • true
  • false
在提取索引字段用作 Elasticsearch 索引名称后,是否保留在文档体中。当为 true(默认)时,字段保留在文档中;设置为 false 可在索引前移除它。对于嵌套的(“/”分隔)路径,因移除而留空的任何父对象也会被修剪。
Timestamp Field每个文档中其值将作为 @timestamp 字段写入 Elasticsearch 的字段名称,根据“字段路径模式”属性解释为字面字段名或嵌套的“/”分隔路径。如果字段不存在或此属性留空,则不设置 @timestamp。
支持表达式语言:是(仅使用环境/系统变量求值)
Retain Timestamp Fieldtrue
  • true
  • false
在将时间戳字段的值复制到 @timestamp 后,是否保留在文档体中。当为 true(默认)时,字段保留在文档中;设置为 false 可在索引前移除它。对于嵌套的(“/”分隔)路径,因移除而留空的任何父对象也会被修剪。
Character SetUTF-8指定文档数据的字符集。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Max JSON Field String Length20 MB解析 JSON 文档或属性时字符串值允许的最大长度。
Client Service控制器服务 API:
ElasticSearchClientService
cn.org.acal.lynxus-lynxus-elasticsearch-client-service-api-nar-2.11.8
用于运行查询的 Elasticsearch 客户端服务。
Log Error Responsesfalse
  • true
  • false
如果启用此选项,错误将以错误日志级别记录到 Lynxus 日志中。否则,仅在 Lynxus 整体启用调试日志时才记录。此选项的目的是
输出错误响应false
  • true
  • false
如果启用,来自 Elasticsearch 标记为 "error" 的响应消息将输出到 "error_responses" 关系。这不影响 FlowFile 输出到 "successful" 或 "errors" 关系。
输出批量请求false
  • true
  • false
如果启用,每个 Elasticsearch _bulk 请求体将作为 FlowFile 写入到 "bulk_request" 关系。用于调试。每个 FlowFile 包含与发送到 Elasticsearch 完全相同的完整 NDJSON 请求体。
将未找到视为成功true
  • true
  • false
如果为 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