ConsumeElasticsearch

文档中心 › 组件索引 › ConsumeElasticsearch

ConsumeElasticsearch Processor

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

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

描述

使用 Range 查询对字段重复运行分页查询以使用 Elasticsearch 索引/查询中的新文档的处理器。 处理器将检索多页结果,直到没有更多结果可用或达到分页保持活动期限,之后范围查询将根据上次检索到的文档值自动更新字段约束。

标签

elasticsearchelasticsearch7elasticsearch8elasticsearch9queryscrollpagesearchjson

属性

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

名称默认值可选值描述
Range Query Field作为 Elasticsearch Range 查询的一部分使用「gt」边界匹配进行跟踪的字段。此字段必须存在于 Elasticsearch 文档中才能被检索。
排序顺序asc
  • asc
  • desc
对 "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 FiltersJSON 语法中的一个或多个查询过滤器,不是 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 属性与环境/系统变量求值)
AggregationsJSON 语法中的一个或多个查询聚合(或「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 Length20 MB解析 JSON 文档或属性时字符串值允许的最大长度。
Client Service控制器服务 API:
ElasticSearchClientService
cn.org.acal.lynxus-lynxus-elasticsearch-client-service-api-nar-2.11.8
用于运行查询的 Elasticsearch 客户端服务。
Search Results SplitsplitUp-no
  • PER_HIT — 每个 hit 一个 FlowFile。
  • PER_RESPONSE — 每个响应一个 FlowFile。
  • PER_QUERY — 合并所有查询响应的结果(整个分页 hit 结果集对应一个 FlowFile)。请注意,聚合无法分页,它们在整个结果集上生成,并作为第一页的一部分返回。结果以每行一个 JSON 对象的形式输出(允许在不将所有结果加载到内存的情况下合并来自多页的 hit)。
输出包含所有命中结果的 FlowFile,或为每个单独命中输出一个 FlowFile,或输出包含所有分页响应中所有命中结果的 FlowFile。
Search Results FormatFULL
  • FULL — 包含完整的 Elasticsearch Hit,含 Document Source 和 Metadata。
  • SOURCE_ONLY — 仅 Document Source(存在时)。
  • METADATA_ONLY — 仅 Hit Metadata。
Hits 输出的格式。
Aggregation Results SplitsplitUp-no
  • PER_HIT — 每个 hit 一个 FlowFile。
  • PER_RESPONSE — 每个响应一个 FlowFile。
输出包含所有聚合的 FlowFile 或每个单独聚合的一个 FlowFile。
Aggregation Results FormatFULL
  • FULL — 包含完整的 Elasticsearch 聚合,含 Buckets 和 Metadata。
  • BUCKETS_ONLY — 仅 Bucket 内容。
  • METADATA_ONLY — 仅聚合 Metadata。
聚合输出的格式。
输出无命中false
  • true
  • false
即使查询未找到命中,也输出 "hits" FlowFile。如果为 true,即使输出了 "aggregations",也将输出空的 "hits" FlowFile。
Pagination Typepagination-scroll
  • SCROLL — 使用 Elasticsearch "_scroll" API 对结果分页。不接受额外的查询参数。
  • SEARCH_AFTER — 使用 Elasticsearch "search_after" _search API 对排序结果分页。
  • POINT_IN_TIME — 使用 Elasticsearch(7.10+ 且带 XPack)"point in time" _search API 对排序结果分页。不可与 AWS OpenSearch 一起使用。
要使用的分页方法。并非所有类型都适用于所有 Elasticsearch 版本,请查看 Elasticsearch 文档以确认哪些适用于您的服务并推荐使用。
Pagination Keep Alive10 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 状态被清除后重启,都可能发生这种情况。