搜索输入
当 Watcher 被触发时,使用 search 输入将 Elasticsearch 搜索请求的结果加载到执行上下文中。参阅 搜索输入属性 以获取所有支持的属性。
在搜索输入的 request 对象中,您可以指定
- 您想要搜索的索引
- 搜索类型
- 搜索请求体
搜索请求体支持完整的 Elasticsearch Query DSL——它与 Elasticsearch _search 请求的请求体相同。
例如,以下输入检索 logs 索引中的所有 event 文档
"input" : {
"search" : {
"request" : {
"indices" : [ "logs" ],
"body" : {
"query" : { "match_all" : {}}
}
}
}
}
指定索引时,您可以使用日期数学和通配符。例如,以下输入从当天的每日报价索引中加载最新的 VIXZ 报价
{
"input" : {
"search" : {
"request" : {
"indices" : [ "<stock-quotes-{now/d}>" ],
"body" : {
"size" : 1,
"sort" : {
"timestamp" : { "order" : "desc"}
},
"query" : {
"term" : { "symbol" : "vix"}
}
}
}
}
}
}
您可以使用 extract 属性指定要加载到 Watcher 有效载荷中的搜索响应字段。当搜索生成大量响应且您仅对特定字段感兴趣时,这非常有用。
例如,以下输入仅将命中总数加载到 Watcher 有效载荷中
"input": {
"search": {
"request": {
"indices": [ ".watcher-history*" ]
},
"extract": [ "hits.total.value" ]
}
},
search 输入支持 搜索模板。例如,以下代码片段引用了名为 my_template 的索引模板,并传递 23 的值来填充模板的 value 参数
{
"input" : {
"search" : {
"request" : {
"indices" : [ "logs" ],
"template" : {
"id" : "my_template",
"params" : {
"value" : 23
}
}
}
}
}
...
}
search 输入通常与 script 条件结合使用。例如,以下代码片段添加了一个条件,用于检查搜索结果是否超过五个命中
{
"input" : {
"search" : {
"request" : {
"indices" : [ "logs" ],
"body" : {
"query" : { "match_all" : {} }
}
}
}
},
"condition" : {
"compare" : { "ctx.payload.hits.total" : { "gt" : 5 }}
}
...
}
条件、转换和操作可以通过 Watcher 执行上下文访问搜索结果。例如
- 要将所有搜索命中加载到电子邮件正文中,请使用
ctx.payload.hits。 - 要引用命中总数,请使用
ctx.payload.hits.total。 - 要访问特定的命中,请使用其基于零的数组索引。例如,要获取第三个命中,请使用
ctx.payload.hits.hits.2。 - 要从特定的命中中获取字段值,请使用
ctx.payload.hits.hits.<index>.fields.<fieldname>。例如,要从第一个命中中获取 message 字段,请使用ctx.payload.hits.hits.0.fields.message。
注意
搜索响应中的命中总数作为一个对象在响应中返回。它包含一个 value(命中数量)和一个 relation(指示该值是精确的 ("eq") 还是匹配查询的命中总数的下界 ("gte"))。您可以在搜索请求中将 track_total_hits 设置为 true,以告知 Elasticsearch 始终准确地跟踪命中数量。
| 名称 | 必填 | 默认值 | 描述 |
|---|---|---|---|
request.search_type |
否 | query_then_fetch |
要执行的 搜索请求类型。有效值为:dfs_query_then_fetch 和 query_then_fetch。Elasticsearch 默认值为 query_then_fetch。 |
request.indices |
否 | - | 要搜索的索引。如果省略,将搜索所有索引,这是 Elasticsearch 中的默认行为。 |
request.body |
否 | - | 请求体。该 请求体 遵循您通常在 REST _search 请求体中发送的结构。请求体可以是静态文本,也可以包含 mustache 模板。 |
request.template |
否 | - | 搜索模板的体。参阅 配置模板 以获取更多信息。 |
request.indices_options.expand_wildcards |
否 | open |
如何扩展通配符。有效值为:all、open、closed 和 none。参阅 expand_wildcards 以获取更多信息。 |
request.indices_options.ignore_unavailable |
否 | true |
是否忽略不可用的具体(非通配符)索引、别名或数据流。请参阅 ignore_unavailable 以获取更多信息。 |
request.indices_options.allow_no_indices |
否 | true |
是否允许 (1) 不匹配任何索引的通配符索引表达式,以及 (2) 最终解析集为空的请求。请参阅 allow_no_indices 以获取更多信息。 |
extract |
否 | - | 要从搜索响应中提取并作为有效载荷加载的 JSON 键数组。当搜索生成大量响应时,您可以使用 extract 来选择相关字段,而不是加载整个响应。 |
timeout |
否 | 1m | 等待搜索 API 调用返回的超时时间。如果在此时间内没有返回响应,搜索输入将超时并失败。此设置会覆盖默认的搜索操作超时时间。 |
在指定请求 body 时,您可以在执行上下文中引用以下变量
| 名称 | 描述 |
|---|---|
ctx.watch_id |
当前正在执行的监视器的 ID。 |
ctx.execution_time |
此监视器开始执行的时间。 |
ctx.trigger.triggered_time |
此监视器被触发的时间。 |
ctx.trigger.scheduled_time |
此监视器应该被触发的时间。 |
ctx.metadata.* |
与监视器关联的任何元数据。 |