Painless: Add Context Docs (#31190)

Adds documentation for each the variables and API available with each script context 
usable with a Painless script.
This commit is contained in:
Jack Conradson 2018-07-02 14:44:36 -07:00 committed by GitHub
parent 8f2feb8414
commit 631a53a0e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 781 additions and 3 deletions

View File

@ -7,4 +7,6 @@ include::painless-getting-started.asciidoc[]
include::painless-lang-spec.asciidoc[]
include::painless-contexts.asciidoc[]
include::painless-api-reference.asciidoc[]

View File

@ -0,0 +1,58 @@
[[painless-contexts]]
== Painless contexts
:es_version: https://www.elastic.co/guide/en/elasticsearch/reference/master
:xp_version: https://www.elastic.co/guide/en/x-pack/current
A Painless script is evaluated within a context. Each context has values that
are available as local variables, a whitelist that controls the available
classes, and the methods and fields within those classes (API), and
if and what type of value is returned.
A Painless script is typically executed within one of the contexts in the table
below. Note this is not necessarily a comprehensive list as custom plugins and
specialized code may define new ways to use a Painless script.
[options="header",cols="<1,<1,<1"]
|====
| Name | Painless Documentation
| Elasticsearch Documentation
| Update | <<painless-update-context, Painless Documentation>>
| {es_version}/docs-update.html[Elasticsearch Documentation]
| Update by query | <<painless-update-by-query-context, Painless Documentation>>
| {es_version}/docs-update-by-query.html[Elasticsearch Documentation]
| Reindex | <<painless-reindex-context, Painless Documentation>>
| {es_version}/docs-reindex.html[Elasticsearch Documentation]
| Sort | <<painless-sort-context, Painless Documentation>>
| {es_version}/search-request-sort.html[Elasticsearch Documentation]
| Similarity | <<painless-similarity-context, Painless Documentation>>
| {es_version}/index-modules-similarity.html[Elasticsearch Documentation]
| Weight | <<painless-similarity-context, Painless Documentation>>
| {es_version}/index-modules-similarity.html[Elasticsearch Documentation]
| Score | <<painless-score-context, Painless Documentation>>
| {es_version}/query-dsl-function-score-query.html[Elasticsearch Documentation]
| Field | <<painless-field-context, Painless Documentation>>
| {es_version}/search-request-script-fields.html[Elasticsearch Documentation]
| Filter | <<painless-filter-context, Painless Documentation>>
| {es_version}/query-dsl-script-query.html[Elasticsearch Documentation]
| Minimum should match | <<painless-min-should-match-context, Painless Documentation>>
| {es_version}/query-dsl-terms-set-query.html[Elasticsearch Documentation]
| Metric aggregation initialization | <<painless-metric-agg-init-context, Painless Documentation>>
| {es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[Elasticsearch Documentation]
| Metric aggregation map | <<painless-metric-agg-map-context, Painless Documentation>>
| {es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[Elasticsearch Documentation]
| Metric aggregation combine | <<painless-metric-agg-combine-context, Painless Documentation>>
| {es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[Elasticsearch Documentation]
| Metric aggregation reduce | <<painless-metric-agg-reduce-context, Painless Documentation>>
| {es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[Elasticsearch Documentation]
| Bucket aggregation | <<painless-bucket-agg-context, Painless Documentation>>
| {es_version}/search-aggregations-pipeline-bucket-script-aggregation.html[Elasticsearch Documentation]
| Ingest processor | <<painless-ingest-processor-context, Painless Documentation>>
| {es_version}/script-processor.html[Elasticsearch Documentation]
| Watcher condition | <<painless-watcher-condition-context, Painless Documentation>>
| {xp_version}/condition-script.html[Elasticsearch Documentation]
| Watcher transform | <<painless-watcher-transform-context, Painless Documentation>>
| {xp_version}/transform-script.html[Elasticsearch Documentation]
|====
include::painless-contexts/index.asciidoc[]

View File

@ -0,0 +1,35 @@
include::painless-update-context.asciidoc[]
include::painless-update-by-query-context.asciidoc[]
include::painless-reindex-context.asciidoc[]
include::painless-sort-context.asciidoc[]
include::painless-similarity-context.asciidoc[]
include::painless-weight-context.asciidoc[]
include::painless-score-context.asciidoc[]
include::painless-field-context.asciidoc[]
include::painless-filter-context.asciidoc[]
include::painless-min-should-match-context.asciidoc[]
include::painless-metric-agg-init-context.asciidoc[]
include::painless-metric-agg-map-context.asciidoc[]
include::painless-metric-agg-combine-context.asciidoc[]
include::painless-metric-agg-reduce-context.asciidoc[]
include::painless-bucket-agg-context.asciidoc[]
include::painless-ingest-processor-context.asciidoc[]
include::painless-watcher-condition-context.asciidoc[]
include::painless-watcher-transform-context.asciidoc[]

View File

@ -0,0 +1,21 @@
[[painless-bucket-agg-context]]
=== Bucket aggregation context
Use a Painless script in an
{es_version}/search-aggregations-pipeline-bucket-script-aggregation.html[bucket aggregation]
to calculate a value as a result in a bucket.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query. The parameters
include values defined as part of the `buckets_path`.
*Return*
numeric::
The calculated value as the result.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,31 @@
[[painless-field-context]]
=== Field context
Use a Painless script to create a
{es_version}/search-request-script-fields.html[script field] to return
a customized value for each document in the results of a query.
*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.
{es_version}/mapping-source-field.html[`ctx['_source']`] (`Map`)::
Contains extracted JSON in a `Map` and `List` structure for the fields
existing in a stored document.
`_score` (`double` read-only)::
The original score of the specified document.
*Return*
`Object`::
The customized value for each document.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,26 @@
[[painless-filter-context]]
=== Filter context
Use a Painless script as a {es_version}/query-dsl-script-query.html[filter] in a
query to include and exclude documents.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`doc` (`Map`, read-only)::
Contains the fields of the current document where each field is a
`List` of values.
*Return*
`boolean`::
Return `true` if the current document should be returned as a result of
the query, and `false` otherwise.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,41 @@
[[painless-ingest-processor-context]]
=== Ingest processor context
Use a Painless script in an {es_version}/script-processor.html[ingest processor]
to modify documents upon insertion.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
{es_version}/mapping-index-field.html[`ctx['_index']`] (`String`)::
The name of the index.
{es_version}/mapping-type-field.html[`ctx['_type']`] (`String`)::
The type of document within an index.
`ctx` (`Map`)::
Contains extracted JSON in a `Map` and `List` structure for the fields
that are part of the document.
*Side Effects*
{es_version}/mapping-index-field.html[`ctx['_index']`]::
Modify this to change the destination index for the current document.
{es_version}/mapping-type-field.html[`ctx['_type']`]::
Modify this to change the type for the current document.
`ctx` (`Map`, read-only)::
Modify the values in the `Map/List` structure to add, modify, or delete
the fields of a document.
*Return*
void::
No expected return value.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,27 @@
[[painless-metric-agg-combine-context]]
=== Metric aggregation combine context
Use a Painless script to
{es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[combine]
values for use in a scripted metric aggregation. A combine script is run once
per shard following a <<painless-metric-agg-map-context, map script>> and is
optional as part of a full metric aggregation.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`params['_agg']` (`Map`)::
`Map` with values available from the prior map script.
*Return*
`List`, `Map`, `String`, or primitive::
A value collected for use in a
<<painless-metric-agg-reduce-context, reduce script>>. If no reduce
script is specified, the value is used as part of the result.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,32 @@
[[painless-metric-agg-init-context]]
=== Metric aggregation initialization context
Use a Painless script to
{es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[initialize]
values for use in a scripted metric aggregation. An initialization script is
run prior to document collection once per shard and is optional as part of the
full metric aggregation.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`params['_agg']` (`Map`)::
Empty `Map` used to add values for use in a
<<painless-metric-agg-map-context, map script>>.
*Side Effects*
`params['_agg']` (`Map`)::
Add values to this `Map` to for use in a map. Additional values must
be of the type `Map`, `List`, `String` or primitive.
*Return*
`void`::
No expected return value.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,47 @@
[[painless-metric-agg-map-context]]
=== Metric aggregation map context
Use a Painless script to
{es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[map]
values for use in a scripted metric aggregation. A map script is run once per
collected document following an optional
<<painless-metric-agg-init-context, initialization script>> and is required as
part of a full metric aggregation.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`params['_agg']` (`Map`)::
`Map` used to add values for processing in a
<<painless-metric-agg-map-context, combine script>> or returned
directly.
`doc` (`Map`, read-only)::
Contains the fields of the current document where each field is a
`List` of values.
`_score` (`double` read-only)::
The similarity score of the current document.
*Side Effects*
`params['_agg']` (`Map`)::
Use this `Map` to add values for processing in a combine script.
Additional values must be of the type `Map`, `List`, `String` or
primitive. If an initialization script is provided as part the
aggregation then values added from the initialization script are
available as well. If no combine script is specified, values must be
directly stored in `_agg`. If no combine script and no
<<painless-metric-agg-reduce-context, reduce script>> are specified, the
values are used as the result.
*Return*
`void`::
No expected return value.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,28 @@
[[painless-metric-agg-reduce-context]]
=== Metric aggregation reduce context
Use a Painless script to
{es_version}/search-aggregations-metrics-scripted-metric-aggregation.html[reduce]
values to produce the result of a scripted metric aggregation. A reduce script
is run once on the coordinating node following a
<<painless-metric-agg-combine-context, combine script>> (or a
<<painless-metric-agg-map-context, map script>> if no combine script is
specified) and is optional as part of a full metric aggregation.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`params['_aggs']` (`Map`)::
`Map` with values available from the prior combine script (or a map
script if no combine script is specified).
*Return*
`List`, `Map`, `String`, or primitive::
A value used as the result.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,28 @@
[[painless-min-should-match-context]]
=== Minimum should match context
Use a Painless script to specify the
{es_version}/query-dsl-terms-set-query.html[minimum] number of terms that a
specified field needs to match with for a document to be part of the query
results.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`params['num_terms']` (`int`, read-only)::
The number of terms specified to match with.
`doc` (`Map`, read-only)::
Contains the fields of the current document where each field is a
`List` of values.
*Return*
`int`::
The minimum number of terms required to match the current document.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,68 @@
[[painless-reindex-context]]
=== Reindex context
Use a Painless script in a {es_version}/docs-reindex.html[reindex] operation to
add, modify, or delete fields within each document in an original index as its
reindexed into a target index.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`ctx['_op']` (`String`)::
The name of the operation.
{es_version}/mapping-routing-field.html[`ctx['_routing']`] (`String`)::
The value used to select a shard for document storage.
{es_version}/mapping-index-field.html[`ctx['_index']`] (`String`)::
The name of the index.
{es_version}/mapping-type-field.html[`ctx['_type']`] (`String`)::
The type of document within an index.
{es_version}/mapping-id-field.html[`ctx['_id']`] (`int`, read-only)::
The unique document id.
`ctx['_version']` (`int`)::
The current version of the document.
{es_version}/mapping-source-field.html[`ctx['_source']`] (`Map`)::
Contains extracted JSON in a `Map` and `List` structure for the fields
existing in a stored document.
*Side Effects*
`ctx['_op']`::
Use the default of `index` to update a document. Set to `none` to
specify no operation or `delete` to delete the current document from
the index.
{es_version}/mapping-routing-field.html[`ctx['_routing']`]::
Modify this to change the routing value for the current document.
{es_version}/mapping-index-field.html[`ctx['_index']`]::
Modify this to change the destination index for the current document.
{es_version}/mapping-type-field.html[`ctx['_type']`]::
Modify this to change the type for the current document.
{es_version}/mapping-id-field.html[`ctx['_id']`]::
Modify this to change the id for the current document.
`ctx['_version']` (`int`)::
Modify this to modify the version for the current document.
{es_version}/mapping-source-field.html[`ctx['_source']`]::
Modify the values in the `Map/List` structure to add, modify, or delete
the fields of a document.
*Return*
`void`::
No expected return value.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,27 @@
[[painless-score-context]]
=== Score context
Use a Painless script in a
{es_version}/query-dsl-function-score-query.html[function score] to apply a new
score to documents returned from a query.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`doc` (`Map`, read-only)::
Contains the fields of the current document where each field is a
`List` of values.
`_score` (`double` read-only)::
The similarity score of the current document.
*Return*
`double`::
The score for the current document.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,53 @@
[[painless-similarity-context]]
=== Similarity context
Use a Painless script to create a
{es_version}/index-modules-similarity.html[similarity] equation for scoring
documents in a query.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in at query-time.
`query.boost` (`float`, read-only)::
The boost value if provided by the query. If this is not provided the
value is `1.0f`.
`field.docCount` (`long`, read-only)::
The number of documents that have a value for the current field.
`field.sumDocFreq` (`long`, read-only)::
The sum of all terms that exist for the current field. If this is not
available the value is `-1`.
`field.sumTotalTermFreq` (`long`, read-only)::
The sum of occurrences in the index for all the terms that exist in the
current field. If this is not available the value is `-1`.
`term.docFreq` (`long`, read-only)::
The number of documents that contain the current term in the index.
`term.totalTermFreq` (`long`, read-only)::
The total occurrences of the current term in the index.
`doc.length` (`long`, read-only)::
The number of tokens the current document has in the current field.
`doc.freq` (`long`, read-only)::
The number of occurrences of the current term in the current
document for the current field.
*Return*
`double`::
The similarity score for the current document.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,26 @@
[[painless-sort-context]]
=== Sort context
Use a Painless script to
{es_version}/search-request-sort.html[sort] the documents in a query.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`doc` (`Map`, read-only)::
Contains the fields of the current document where each field is a
`List` of values.
`_score` (`double` read-only)::
The similarity score of the current document.
*Return*
`double`::
The score for the specified document.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,54 @@
[[painless-update-by-query-context]]
=== Update by query context
Use a Painless script in an
{es_version}/docs-update-by-query.html[update by query] operation to add,
modify, or delete fields within each of a set of documents collected as the
result of query.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`ctx['_op']` (`String`)::
The name of the operation.
{es_version}/mapping-routing-field.html[`ctx['_routing']`] (`String`, read-only)::
The value used to select a shard for document storage.
{es_version}/mapping-index-field.html[`ctx['_index']`] (`String`, read-only)::
The name of the index.
{es_version}/mapping-type-field.html[`ctx['_type']`] (`String`, read-only)::
The type of document within an index.
{es_version}/mapping-id-field.html[`ctx['_id']`] (`int`, read-only)::
The unique document id.
`ctx['_version']` (`int`, read-only)::
The current version of the document.
{es_version}/mapping-source-field.html[`ctx['_source']`] (`Map`)::
Contains extracted JSON in a `Map` and `List` structure for the fields
existing in a stored document.
*Side Effects*
`ctx['_op']`::
Use the default of `index` to update a document. Set to `none` to
specify no operation or `delete` to delete the current document from
the index.
{es_version}/mapping-source-field.html[`ctx['_source']`]::
Modify the values in the `Map/List` structure to add, modify, or delete
the fields of a document.
*Return*
`void`::
No expected return value.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,55 @@
[[painless-update-context]]
=== Update context
Use a Painless script in an {es_version}/docs-update.html[update] operation to
add, modify, or delete fields within a single document.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`ctx['_op']` (`String`)::
The name of the operation.
{es_version}/mapping-routing-field.html[`ctx['_routing']`] (`String`, read-only)::
The value used to select a shard for document storage.
{es_version}/mapping-index-field.html[`ctx['_index']`] (`String`, read-only)::
The name of the index.
{es_version}/mapping-type-field.html[`ctx['_type']`] (`String`, read-only)::
The type of document within an index.
{es_version}/mapping-id-field.html[`ctx['_id']`] (`int`, read-only)::
The unique document id.
`ctx['_version']` (`int`, read-only)::
The current version of the document.
`ctx['_now']` (`long`, read-only)::
The current timestamp in milliseconds.
{es_version}/mapping-source-field.html[`ctx['_source']`] (`Map`)::
Contains extracted JSON in a `Map` and `List` structure for the fields
existing in a stored document.
*Side Effects*
`ctx['_op']`::
Use the default of `index` to update a document. Set to `none` to
specify no operation or `delete` to delete the current document from
the index.
{es_version}/mapping-source-field.html[`ctx['_source']`]::
Modify the values in the `Map/List` structure to add, modify, or delete
the fields of a document.
*Return*
`void`::
No expected return value.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,38 @@
[[painless-watcher-condition-context]]
=== Watcher condition context
Use a Painless script as a {xp_version}/condition-script.html[watcher condition]
to test if a response is necessary.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`ctx['watch_id']` (`String`, read-only)::
The id of the watch.
`ctx['execution_time']` (`DateTime`, read-only)::
The start time for the watch.
`ctx['trigger']['scheduled_time']` (`DateTime`, read-only)::
The scheduled trigger time for the watch.
`ctx['trigger']['triggered_time']` (`DateTime`, read-only)::
The actual trigger time for the watch.
`ctx['metadata']` (`Map`, read-only)::
Any metadata associated with the watch.
`ctx['payload']` (`Map`, read-only)::
The accessible watch data based upon the
{xp_version}/input.html[watch input].
*Return*
`boolean`::
Expects `true` if the condition is met, and `false` otherwise.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,39 @@
[[painless-watcher-transform-context]]
=== Watcher transform context
Use a Painless script to {xp_version}/transform-script.html[transform] watch
data into a new payload for use in a response to a condition.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`ctx['watch_id']` (`String`, read-only)::
The id of the watch.
`ctx['execution_time']` (`DateTime`, read-only)::
The start time for the watch.
`ctx['trigger']['scheduled_time']` (`DateTime`, read-only)::
The scheduled trigger time for the watch.
`ctx['trigger']['triggered_time']` (`DateTime`, read-only)::
The actual trigger time for the watch.
`ctx['metadata']` (`Map`, read-only)::
Any metadata associated with the watch.
`ctx['payload']` (`Map`, read-only)::
The accessible watch data based upon the
{xp_version}/input.html[watch input].
*Return*
`Object`::
The new payload.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -0,0 +1,42 @@
[[painless-weight-context]]
=== Weight context
Use a Painless script to create a
{es_version}/index-modules-similarity.html[weight] for use in a
<<painless-similarity-context, similarity script>>. Weight is used to prevent
recalculation of constants that remain the same across documents.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`query.boost` (`float`, read-only)::
The boost value if provided by the query. If this is not provided the
value is `1.0f`.
`field.docCount` (`long`, read-only)::
The number of documents that have a value for the current field.
`field.sumDocFreq` (`long`, read-only)::
The sum of all terms that exist for the current field. If this is not
available the value is `-1`.
`field.sumTotalTermFreq` (`long`, read-only)::
The sum of occurrences in the index for all the terms that exist in the
current field. If this is not available the value is `-1`.
`term.docFreq` (`long`, read-only)::
The number of documents that contain the current term in the index.
`term.totalTermFreq` (`long`, read-only)::
The total occurrences of the current term in the index.
*Return*
`double`::
A scoring factor used across all documents.
*API*
The standard <<painless-api-reference, Painless API>> is available.

View File

@ -184,7 +184,7 @@ brace_access: '[' expression ']'
store `def` to `x`
<5> declare `def y`;
implicit cast `int 1` to `def` -> `def`;
store `def ` to `y`;
store `def` to `y`;
<6> declare `int i`;
load from `d` -> `def`
implicit cast `def` to `1-d int array reference`