ConsumeElasticsearch Processor
描述
使用 Range 查询对字段重复运行分页查询以使用 Elasticsearch 索引/查询中的新文档的处理器。 处理器将检索多页结果,直到没有更多结果可用或达到分页保持活动期限,之后范围查询将根据上次检索到的文档值自动更新字段约束。
标签
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| Range Query Field | | 作为 Elasticsearch Range 查询的一部分使用「gt」边界匹配进行跟踪的字段。此字段必须存在于 Elasticsearch 文档中才能被检索。 | |
| 排序顺序 | asc |
| 对 "Range Query Field" 进行排序的顺序。"Range Query Field" 字段的 "sort" 子句将前置到任何提供的 "Sort" 子句之前。如果 "Range Query Field" 字段已存在 "sort" 子句,则不会更新。 |
| 初始值 | | 如果处理器之前未运行过,则用于查询的初始值。如果处理器之前已运行并在其状态中存储了值,则此属性将被忽略。如果未提供值且处理器之前未运行过,则不使用范围查询边界,即所有文档将按照指定的 "排序顺序" 顺序检索。 | |
| 初始值日期格式 | | 如果 "Range Query Field" 是日期字段,则将 "初始值" 转换为此格式的日期。如果未指定,Elasticsearch 将使用 "Range Query Field" 映射提供的日期格式。有效语法请参阅 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html | |
| 初始值日期时区 | | 如果 "Range Query Field" 是日期字段,则将 "初始值" 转换为此时区的 UTC。有效值为 ISO 8601 UTC 偏移量,例如 "+01:00" 或 "-08:00",以及 IANA 时区 ID,例如 "Europe/London"。 | |
| Additional Filters | | JSON 语法中的一个或多个查询过滤器,不是 Lucene 语法。例如:[{"match":{"somefield":"somevalue"}}, {"match":{"anotherfield":"anothervalue"}}]。这些过滤器将用作 Boolean 查询的过滤器。 | |
| Size | | 查询中要检索的最大文档数。如果查询被分页,此「size」适用于查询的每一页,而不是整个结果集的「size」。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Sort | | 按一个或多个字段排序结果,JSON 语法。例如:[{"price" : {"order" : "asc", "mode" : "avg"}}, {"post_date" : {"format": "strict_date_optional_time_nanos"}}] 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Aggregations | | JSON 语法中的一个或多个查询聚合(或「aggs」)。例如:{"items": {"terms": {"field": "product", "size": 10}}} 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Fields | | 要检索的已索引文档的字段,JSON 语法。例如:["user.id", "http.response.*", {"field": "@timestamp", "format": "epoch_millis"}] 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Script Fields | | 在查询运行时通过脚本评估创建的字段,JSON 语法。例如:{"test1": {"script": {"lang": "painless", "source": "doc['price'].value * 2"}}, "test2": {"script": { 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Query Attribute | | 如果设置,则执行的查询将在指定属性中的每个结果 FlowFile 上设置。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Index | | 要使用的索引的名称。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Type | | 该文档的类型(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 客户端服务。 |
| Search Results Split | splitUp-no |
| 输出包含所有命中结果的 FlowFile,或为每个单独命中输出一个 FlowFile,或输出包含所有分页响应中所有命中结果的 FlowFile。 |
| Search Results Format | FULL |
| Hits 输出的格式。 |
| Aggregation Results Split | splitUp-no |
| 输出包含所有聚合的 FlowFile 或每个单独聚合的一个 FlowFile。 |
| Aggregation Results Format | FULL |
| 聚合输出的格式。 |
| 输出无命中 | false |
| 即使查询未找到命中,也输出 "hits" FlowFile。如果为 true,即使输出了 "aggregations",也将输出空的 "hits" FlowFile。 |
| Pagination Type | pagination-scroll |
| 要使用的分页方法。并非所有类型都适用于所有 Elasticsearch 版本,请查看 Elasticsearch 文档以确认哪些适用于您的服务并推荐使用。 |
| Pagination Keep Alive | 10 mins | 分页「keep_alive」周期。Elasticsearch 将在请求之间保持 scroll/pit 游标存活的时间段(这不是所有页面返回的预期时间,而是允许的最大时 |
动态属性
| 名称 | 值 | 描述 |
|---|---|---|
| HTTP 请求头的名称 | 用于检索 HTTP 请求头值的 Record Path 表达式 | 前缀:HEADER: - 将指定的属性名称/值作为 HTTP 请求头添加到 Elasticsearch 请求中。如果 Record Path 表达式结果为 null 或空值,则将省略该 HTTP 请求头。 |
| 要添加的 URL 查询参数的名称 | URL 查询参数的值 | 在用于处理的 Elasticsearch URL 中将指定的属性名称/值添加为查询参数。这些参数将覆盖查询请求体中任何匹配的参数。对于 SCROLL 类型的查询,这些参数仅在初始(第一页)查询中使用,因为 Elasticsearch Scroll API 不支持后续数据页使用相同的查询参数。 |
关系 (Relationships)
| 名称 | 描述 | 自动终止 |
|---|---|---|
aggregations | 聚合将路由到此关系。 | 否 |
failure | 所有因与服务器可用性无关的原因而失败的 FlowFile 都会转至此关系。 | 否 |
hits | 搜索命中将路由到此关系。 | 否 |
retry | 由于服务器/集群可用性而失败的所有 FlowFile 都会转至此关系。 | 否 |
写入的 FlowFile 属性
| 名称 | 描述 |
|---|---|
mime.type | 应用程序/json |
page.number | 页面(请求)的编号,从 1 开始,其中返回输出 FlowFile 中的结果 |
hit.count | 输出 FlowFile 中的命中数 |
elasticsearch.query.error | 如果查询索引出错,Elasticsearch 提供的错误消息。 |
状态管理
| 作用域 | 描述 |
|---|---|
| CLUSTER | 分页状态(scrollId、searchAfter、pitId、hitCount、pageCount、pageExpirationTimestamp、trackingRangeValue)在此处理器的调用之间保留,直到 Scroll/PiT 过期(当当前时间晚于上次查询执行加上分页保活间隔时)。 |
受限 (Restricted)
该组件不受限。
输入要求
该组件不允许有传入连接。
系统资源考量
| 资源 | 描述 |
|---|---|
| MEMORY | 应注意每页的大小,因为 Elasticsearch 的每个响应将一次性全部加载到内存中并转换为结果 FlowFile。 |
详细说明
ConsumeElasticsearch
该 Processor 适用于 Elasticsearch JSON DSL 与 Elasticsearch 5.X 及以上 版本。它的设计目标是能够使用输入属性创建一个 JSON 查询,并以分页方式 对 Elasticsearch 集群执行。与 "restapi" bundle 中的所有 Processor 一样,它使用官方 Elastic 客户端 API,因此支持 leader 检测。
查询通过可用的方法之一在 Elasticsearch 中分页——"Scroll" 或 "Search After"(对于启用 XPack 的 Elasticsearch 7.10+,可以可选地 配合 "Point in Time")。每页结果数量可以通过 size 属性控制。
结果会按要跟踪的字段排序,sort order 作为属性设置。
搜索结果和聚合结果可以拆分为多个 FlowFile。聚合结果只在顶层 拆分,因为嵌套聚合如果与父聚合分离,就会失去上下文(从而失去 其价值)。此外,所有页的结果可以合并为单个 FlowFile(但 Processor 在任何时刻都只把当前页的数据加载到内存)。
以下是为跟踪 "@timestamp" 字段而创建的查询示例:
{
"query": {
"size": 10000,
"sort": {
"@timestamp": "desc"
},
"bool": {
"filter": [
{
"range": {
"@timestamp": {
"gt": "2023-09-01"
}
}
}
]
}
}
}
可以在 query filter 属性中以 JSON 字符串添加额外的 "filter" 项,例如:
[
{
"term": {
"department": "accounts"
}
},
{
"term": {
"title.keyword": "Annual Report"
}
}
]
跨 Processor 执行的查询分页
该 Processor 按计划周期运行,以重复执行同一查询。一旦在 Elasticsearch 中发起分页查询,该 Processor 会持续获取同一查询的 结果,直到没有更多结果为止。之后,会使用相同的查询 JSON 发起 新的分页查询,但 "range" 过滤查询的 "gt" 字段会设为从上一次 结果中获取的最后一个值。
如果该 Processor 的结果是 "Combined",分页查询会在单次调用内 持续运行,直到没有更多结果(之后该 Processor 会在下次调用时 启动新的分页查询)。如果结果是 "Split" 或 "Per Page",该 Processor 的每次调用都会获取下一页结果,直到没有更多结果,或 分页查询在 Elasticsearch 中过期。
重置查询 / 清除 Processor 状态
Cluster State 用于跟踪该 Processor 中分页查询的进度。如果需要在 分页查询已开始之后完全重启查询或更改 Processor 配置,请务必在 停止该 Processor 之后、重启之前对其执行 "Clear State"。
注意,清除 Processor 状态会丢失对已获取文档的跟踪进度。在重启 该 Processor 之前,请用合适的值更新 "Initial Value",以便从 之前的位置继续。
重复结果
该 Processor 不会尝试在查询之间去重。例如,如果同一查询运行两次 且结果(部分或全部)相同,两次的输出都会包含这些相同的结果。 当正在获取一页数据时 Lynxus 主节点(Primary Node)发生变化, 或者 Processor 状态被清除后重启,都可能发生这种情况。