mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-06-28 09:28:55 -04:00
175 lines
5.2 KiB
Markdown
175 lines
5.2 KiB
Markdown
---
|
||
mapped_pages:
|
||
- https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-runtime-fields-context.html
|
||
products:
|
||
- id: painless
|
||
---
|
||
|
||
# Runtime fields context [painless-runtime-fields-context]
|
||
|
||
Use a Painless script to calculate and emit [runtime field](/reference/scripting-languages/painless/use-painless-scripts-in-runtime-fields.md) values.
|
||
|
||
See the [runtime fields](docs-content://manage-data/data-store/mapping/runtime-fields.md) documentation for more information about how to use runtime fields.
|
||
|
||
**Methods**
|
||
|
||
$$$runtime-emit-method$$$
|
||
|
||
`emit`
|
||
: (Required) Accepts the values from the script valuation. Scripts can call the `emit` method multiple times to emit multiple values.
|
||
|
||
The `emit` method applies only to scripts used in a [runtime fields context](/reference/scripting-languages/painless/painless-api-examples.md#painless-execute-runtime-context).
|
||
|
||
::::{important}
|
||
The `emit` method cannot accept `null` values. Do not call this method if the referenced fields do not have any values.
|
||
::::
|
||
|
||
|
||
::::{dropdown} Signatures of emit
|
||
The signature for `emit` depends on the `type` of the field.
|
||
|
||
`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`
|
||
: Defines a [grok pattern](/reference/enrich-processor/grok-processor.md) to extract structured fields out of a single text field within a document. A grok pattern is like a regular expression that supports aliased expressions that can be reused. See [Define a runtime field with a grok pattern](docs-content://manage-data/data-store/mapping/explore-data-with-runtime-fields.md#runtime-examples-grok).
|
||
|
||
::::{dropdown} Properties of grok
|
||
`extract`
|
||
: Indicates the values to return. This method applies only to `grok` and `dissect` methods.
|
||
::::
|
||
|
||
|
||
`dissect`
|
||
: Defines a [dissect pattern](/reference/enrich-processor/dissect-processor.md). Dissect operates much like grok, but does not accept regular expressions. See [Define a runtime field with a dissect pattern](docs-content://manage-data/data-store/mapping/explore-data-with-runtime-fields.md#runtime-examples-dissect).
|
||
|
||
::::{dropdown} Properties of dissect
|
||
`extract`
|
||
: Indicates the values to return. This method applies only to `grok` and `dissect` methods.
|
||
::::
|
||
|
||
|
||
**Variables**
|
||
|
||
`params` (`Map`, read-only)
|
||
: User-defined parameters passed in as part of the query.
|
||
|
||
`doc` (`Map`, read-only)
|
||
: Contains the fields of the specified document where each field is a `List` of values.
|
||
|
||
[`params['_source']`](/reference/elasticsearch/mapping-reference/mapping-source-field.md) (`Map`, read-only)
|
||
: Contains extracted JSON in a `Map` and `List` structure for the fields existing in a stored document.
|
||
|
||
**Return**
|
||
|
||
`void`
|
||
: No expected return value.
|
||
|
||
**API**
|
||
|
||
Both the standard [Painless API](https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-api-reference-shared.html) and [Specialized Field API](https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-api-reference-field.html) are available.
|
||
|
||
**Example**
|
||
|
||
To run the examples, first follow the steps in [context examples](/reference/scripting-languages/painless/painless-context-examples.md).
|
||
|
||
Then, run the following request to define a runtime field named `day_of_week`. This field contains a script with the same `source` defined in [Field context](/reference/scripting-languages/painless/painless-field-context.md), but also uses an `emit` function that runtime fields require when defining a Painless script.
|
||
|
||
Because `day_of_week` is a runtime field, it isn’t indexed, and the included script only runs at query time:
|
||
|
||
```console
|
||
PUT seats/_mapping
|
||
{
|
||
"runtime": {
|
||
"day_of_week": {
|
||
"type": "keyword",
|
||
"script": {
|
||
"source": "emit(doc['datetime'].value.getDayOfWeekEnum().toString())"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
After defining the runtime field and script in the mappings, you can run a query that includes a terms aggregation for `day_of_week`. When the query runs, {{es}} evaluates the included Painless script and dynamically generates a value based on the script definition:
|
||
|
||
```console
|
||
GET seats/_search
|
||
{
|
||
"size": 0,
|
||
"fields": [
|
||
"time",
|
||
"day_of_week"
|
||
],
|
||
"aggs": {
|
||
"day_of_week": {
|
||
"terms": {
|
||
"field": "day_of_week",
|
||
"size": 10
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
The response includes `day_of_week` for each hit. {{es}} calculates the value for this field dynamically at search time by operating on the `datetime` field defined in the mappings.
|
||
|
||
```console-result
|
||
{
|
||
...
|
||
"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
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|