运行时字段上下文编辑

使用 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
指示要返回的值。此方法仅适用于 grokdissect 方法。
dissect

定义一个dissect 模式。 dissect 的操作方式与 grok 非常相似,但不接受正则表达式。请参阅使用 dissect 模式定义运行时字段

dissect 的属性
extract
指示要返回的值。此方法仅适用于 grokdissect 方法。

变量

params (Map,只读)
作为查询的一部分传入的用户定义参数。
doc (Map,只读)
包含指定文档的字段,其中每个字段都是一个值的 List
params['_source'] (Map,只读)
包含存储文档中现有字段的 MapList 结构中的提取 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
        }
      ]
    }
  }
}