[DOCS] Adds snippet comparing two indices to the painless examples (#54563)

This commit is contained in:
István Zoltán Szabó 2020-04-02 08:44:35 +02:00
parent c40ec6a577
commit 3a8e880fe6
1 changed files with 75 additions and 3 deletions

View File

@ -14,6 +14,8 @@ more about the Painless scripting language in the
* <<painless-time-features>>
* <<painless-group-by>>
* <<painless-bucket-script>>
* <<painless-count-http>>
* <<painless-compare>>
NOTE: While the context of the following examples is the {transform} use case,
the Painless scripts in the snippets below can be used in other {es} search
@ -59,8 +61,8 @@ scripted metric aggregation in a {transform}, which provides a metric output.
`last_doc` in the `state` object.
<2> The `map_script` defines `current_date` based on the timestamp of the
document, then compares `current_date` with `state.timestamp_latest`, finally
returns `state.last_doc` from the shard. By using `new HashMap(...)` we copy the
source document, this is important whenever you want to pass the full source
returns `state.last_doc` from the shard. By using `new HashMap(...)` you copy
the source document, this is important whenever you want to pass the full source
object from one phase to the next.
<3> The `combine_script` returns `state` from each shard.
<4> The `reduce_script` iterates through the value of `s.timestamp_latest`
@ -399,3 +401,73 @@ by each shard and assigns the different response types to the appropriate
properties of the `counts` object; error responses to the error counts, success
responses to the success counts, and other responses to the other counts.
Finally, returns the `counts` array with the response counts.
[discrete]
[[painless-compare]]
==== Comparing indices by using scripted metric aggregations
This example shows how to compare the content of two indices by a {transform}
that uses a scripted metric aggregation.
[source,console]
--------------------------------------------------
POST _transform/_preview
{
"id" : "index_compare",
"source" : { <1>
"index" : [
"index1",
"index2"
],
"query" : {
"match_all" : { }
}
},
"dest" : { <2>
"index" : "compare"
},
"pivot" : {
"group_by" : {
"unique-id" : {
"terms" : {
"field" : "<unique-id-field>" <3>
}
}
},
"aggregations" : {
"compare" : { <4>
"scripted_metric" : {
"init_script" : "",
"map_script" : "state.doc = new HashMap(params['_source'])", <5>
"combine_script" : "return state", <6>
"reduce_script" : """ <7>
if (states.size() != 2) {
return "count_mismatch"
}
if (states.get(0).equals(states.get(1))) {
return "match"
} else {
return "mismatch"
}
"""
}
}
}
}
}
--------------------------------------------------
// TEST[skip:setup kibana sample data]
<1> The indices referenced in the `source` object are compared to each other.
<2> The `dest` index contains the results of the comparison.
<3> The `group_by` field needs to be a unique identifier for each document.
<4> Object of the `scripted_metric` aggregation.
<5> The `map_script` defines `doc` in the state object. By using
`new HashMap(...)` you copy the source document, this is important whenever you
want to pass the full source object from one phase to the next.
<6> The `combine_script` returns `state` from each shard.
<7> The `reduce_script` checks if the size of the indices are equal. If they are
not equal, than it reports back a `count_mismatch`. Then it iterates through all
the values of the two indices and compare them. If the values are equal, then it
returns a `match`, otherwise returns a `mismatch`.