运行时字段上下文

编辑

使用 Painless 脚本计算并发出运行时字段的值。

有关如何使用运行时字段的更多信息,请参阅运行时字段文档。

方法

emit

(必需)接受脚本评估中的值。脚本可以多次调用 emit 方法以发出多个值。

emit 方法仅适用于在运行时字段上下文中使用的脚本。

emit 方法不能接受 null 值。如果引用的字段没有任何值,请不要调用此方法。

emit 的签名

emit 的签名取决于字段的 type

boolean

emit(boolean)

date

emit(long)

double

emit(double)

geo_point

emit(double lat, double lon)

ip

emit(String)

long

emit(long)

keyword

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字段上下文中定义的相同,但还使用了一个 emit 函数,该函数是运行时字段在定义 Painless 脚本时所必需的。

因为 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
        }
      ]
    }
  }
}