PutElasticsearchRecord

文档中心 › 组件索引 › PutElasticsearchRecord

PutElasticsearchRecord Processor

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

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

描述

使用官方 Elastic REST 客户端库的记录感知 Elasticsearch put 处理器。 FlowFile 中的每条记录都会转换为要发送到 Elasticsearch _bulk APi 的文档。 可以将多个文档分批放入发送到 Elasticsearch 的每个请求中。 每个文档的批量操作都可以使用记录路径表达式进行配置。

标签

jsonelasticsearchelasticsearch7elasticsearch8elasticsearch9putindexrecord

属性

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

名称默认值可选值描述
Index Operationindex用于索引的操作类型(创建、删除、索引、更新、更新插入)
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Index要使用的索引的名称。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Type该文档的类型(Elasticsearch 用于索引和搜索)。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Timestamp Value用作 @timestamp 字段的值(Elasticsearch 数据流所需)
支持表达式语言:是(使用 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 客户端服务。
Record Reader控制器服务 API:
RecordReaderFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
用于读取来自 FlowFiles 的传入记录的Record Reader。
Batch Size100在单个批次中发送的记录数。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
ID Record Path用于获取与 Elasticsearch 一起使用的 ID 字段的记录路径表达式。如果留空,ID 将由 Elasticsearch 自动生成。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Retain Record Path ID Fieldfalse是否保留现有字段作为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 Timestampfalse是否保留用作@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 Responsesfalse
  • true
  • false
如果启用此选项,错误将以错误日志级别记录到 Lynxus 日志中。否则,仅在 Lynxus 整体启用调试日志时才记录。此选项的目的是
输出错误响应false
  • true
  • false
如果启用,来自 Elasticsearch 标记为 "error" 的响应消息将输出到 "error_responses" 关系。这不影响 FlowFile 输出到 "successful" 或 "errors" 关系。
结果记录写入器控制器服务 API:
RecordSetWriterFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
Elasticsearch 的响应将检查失败的记录,失败的记录将使用此记录写入器服务写入记录集并发送到 "errors" 关系。成功的记录将使用此记录写入器服务写入记录集并发送到 "successful" 关系。
将未找到视为成功true
  • true
  • false
如果为 true,与 "not_found" Elasticsearch 文档关联的记录将路由到 "successful" 关系,否则路由到 "errors" 关系。如果 输出错误响应 为 "true",则来自 Elasticsearch 的 "not_found" 响应将发送到 error_responses 关系。
按批量错误类型分组结果false
  • true
  • 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.countElasticsearch _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