运行时字段上下文
编辑运行时字段上下文编辑
使用 Painless 脚本计算并发出 运行时字段 值。
有关如何使用运行时字段的更多信息,请参阅运行时字段文档。
方法
-
emit
-
(必需)接受来自脚本评估的值。脚本可以多次调用
emit
方法以发出多个值。emit
方法仅适用于运行时字段上下文中使用的脚本。emit
方法不能接受null
值。如果引用的字段没有任何值,请勿调用此方法。emit
的签名emit
的签名取决于字段的类型
。布尔值
emit(boolean)
日期
emit(long)
双精度浮点数
emit(double)
地理点
emit(double lat, double lon)
IP 地址
emit(String)
长整型
emit(long)
关键字
emit(String)
-
grok
-
定义一个grok 模式,用于从文档中的单个文本字段中提取结构化字段。 grok 模式类似于支持可重用的别名表达式的正则表达式。请参阅使用 grok 模式定义运行时字段。
grok
的属性-
extract
- 指示要返回的值。此方法仅适用于
grok
和dissect
方法。
-
-
dissect
-
定义一个dissect 模式。 dissect 的操作方式与 grok 非常相似,但不接受正则表达式。请参阅使用 dissect 模式定义运行时字段。
dissect
的属性-
extract
- 指示要返回的值。此方法仅适用于
grok
和dissect
方法。
-
变量
-
params
(Map
,只读) - 作为查询的一部分传入的用户定义参数。
-
doc
(Map
,只读) - 包含指定文档的字段,其中每个字段都是一个值的
List
。 -
params['_source']
(Map
,只读) - 包含存储文档中现有字段的
Map
和List
结构中的提取 JSON。
返回值
-
void
- 无预期返回值。
API
标准 Painless API 和 专用字段 API 均可用。
示例
要运行示例,请先按照上下文示例中的步骤操作。
然后,运行以下请求以定义名为 day_of_week
的运行时字段。此字段包含一个脚本,该脚本具有与字段上下文中定义的相同的 source
,但也使用运行时字段在定义 Painless 脚本时需要的 emit
函数。
因为 day_of_week
是一个运行时字段,所以它没有被索引,并且包含的脚本只在查询时运行。
PUT seats/_mapping { "runtime": { "day_of_week": { "type": "keyword", "script": { "source": "emit(doc['datetime'].value.getDayOfWeekEnum().toString())" } } } }
在映射中定义运行时字段和脚本后,您可以运行包含 day_of_week
的术语聚合的查询。当查询运行时,Elasticsearch 会评估包含的 Painless 脚本,并根据脚本定义动态生成一个值。
GET seats/_search { "size": 0, "fields": [ "time", "day_of_week" ], "aggs": { "day_of_week": { "terms": { "field": "day_of_week", "size": 10 } } } }
响应包括每个匹配的 day_of_week
。Elasticsearch 在搜索时通过对映射中定义的 datetime
字段进行操作来动态计算此字段的值。
{ ... "hits" : { "total" : { "value" : 11, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "day_of_week" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "TUESDAY", "doc_count" : 5 }, { "key" : "THURSDAY", "doc_count" : 4 }, { "key" : "MONDAY", "doc_count" : 1 }, { "key" : "SUNDAY", "doc_count" : 1 } ] } } }