SearchElasticsearch

文档中心 › 组件索引 › SearchElasticsearch

SearchElasticsearch Processor

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

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

描述

一个允许用户重复运行使用 Elasticsearch Query DSL 编写的分页查询(带聚合)的处理器。

标签

elasticsearchelasticsearch7elasticsearch8elasticsearch9queryscrollpagesearchjson

属性

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

名称默认值可选值描述
Query Definition Stylefull
  • FULL_QUERY — 提供完整的查询。
  • BUILD_QUERY — 从单独的 JSON 对象构建查询。
如何定义 JSON 查询以供处理器使用。
QueryJSON 语法的查询,不是 Lucene 语法。例如:{"query":{"match":{"somefield":"somevalue"}}}。如果查询为空,将使用默认的 JSON 对象,这将导致 Elasticsearch 中的 "match_all" 查询。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Restart On Finishtrue
  • true
  • false
分页搜索完成后,处理器是否应使用相同查询开始另一次搜索。
Query Clause使用 JSON 语法(而非 Lucene 语法)的 "query" 子句。例如:{"match":{"somefield":"somevalue"}}。如果查询为空,将使用默认的 JSON 对象,从而在 Elasticsearch 中产生 "match_all" 查询。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
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
aggregation.name结果位于输出 FlowFile 中的聚合的名称
aggregation.number结果在输出FlowFile中的聚合的数量
page.number页面(请求)的编号,从 1 开始,其中返回输出 FlowFile 中的结果
hit.count输出 FlowFile 中的命中数
elasticsearch.query.error如果查询索引出错,Elasticsearch 提供的错误消息。

状态管理

作用域描述
LOCAL分页状态(scrollId、searchAfter、pitId、hitCount、pageCount、pageExpirationTimestamp)在此处理器的调用之间保留,直到 Scroll/PiT 过期(当当前时间晚于上次查询执行加上分页保活间隔时)。

受限 (Restricted)

该组件不受限。

输入要求

该组件不允许有传入连接。

系统资源考量

资源描述
MEMORY应注意每页的大小,因为 Elasticsearch 的每个响应将一次性全部加载到内存中并转换为结果 FlowFile。

详细说明

SearchElasticsearch

该 Processor 适用于 Elasticsearch JSON DSL 与 Elasticsearch 5.X 及以上 版本。它的设计目标是能够接收一个 JSON 查询(例如来自 Kibana),并 以分页方式原样对 Elasticsearch 集群执行。与 "restapi" bundle 中的所有 Processor 一样,它使用官方 Elastic 客户端 API,因此支持 leader 检测。

要执行的查询必须在 Query 配置属性中提供。

查询通过可用的方法之一在 Elasticsearch 中分页——"Scroll" 或 "Search After"(对于启用 XPack 的 Elasticsearch 7.10+,可以可选地 配合 "Point in Time")。每页结果数量可以通过查询 JSON 中的 size 参数控制。对于 Search After 功能,查询 JSON 中必须 包含 sort 参数。

搜索结果和聚合结果可以拆分为多个 FlowFile。聚合结果只在顶层 拆分,因为嵌套聚合如果与父聚合分离,就会失去上下文(从而失去 其价值)。此外,所有页的结果可以合并为单个 FlowFile(但 Processor 在任何时刻都只把当前页的数据加载到内存)。

以下是可接受的查询示例:

{
  "query": {
    "size": 10000,
    "sort": {
      "product": "desc"
    },
    "match": {
      "restaurant.keyword": "Local Pizzaz FTW Inc"
    }
  },
  "aggs": {
    "weekly_sales": {
      "date_histogram": {
        "field": "date",
        "interval": "week"
      },
      "aggs": {
        "items": {
          "terms": {
            "field": "product",
            "size": 10
          }
        }
      }
    }
  }
}

跨 Processor 执行的查询分页

该 Processor 按计划周期运行,以重复执行同一查询。一旦在 Elasticsearch 中发起分页查询,该 Processor 会持续获取同一查询的 结果,直到没有更多结果为止。之后,会使用相同的查询 JSON 发起 新的分页查询。

如果该 Processor 的结果是 "Combined",分页查询会在单次调用内 持续运行,直到没有更多结果(之后该 Processor 会在下次调用时 启动新的分页查询)。如果结果是 "Split" 或 "Per Page",该 Processor 的每次调用都会获取下一页结果,直到没有更多结果,或 分页查询在 Elasticsearch 中过期。

重置查询 / 清除 Processor 状态

Local State 用于跟踪该 Processor 中分页查询的进度。如果需要在 分页查询已开始之后完全重启查询或更改 Processor 配置,请务必在 停止该 Processor 之后、重启之前对其执行 "Clear State"。

重复结果

该 Processor 不会尝试在查询之间去重。例如,如果同一查询运行两次 且结果(部分或全部)相同,两次的输出都会包含这些相同的结果。 当正在获取一页数据时 Lynxus 主节点(Primary Node)发生变化, 或者 Processor 状态被清除后重启,都可能发生这种情况。

除非更新 Processor 属性,否则该 Processor 会持续运行同一查询。 因此,只要 Elasticsearch 中的数据没有变化,同样的数据会被 多次获取。