Update docs for scripted metric agg
Now that the default language is painless the examples didn't work at all. This fixes them. Closes #21536
This commit is contained in:
parent
6cafe688b3
commit
7dcff27aea
|
@ -171,6 +171,10 @@ integTest {
|
|||
}
|
||||
configFile 'scripts/my_script.js'
|
||||
configFile 'scripts/my_script.py'
|
||||
configFile 'scripts/my_init_script.painless'
|
||||
configFile 'scripts/my_map_script.painless'
|
||||
configFile 'scripts/my_combine_script.painless'
|
||||
configFile 'scripts/my_reduce_script.painless'
|
||||
configFile 'userdict_ja.txt'
|
||||
configFile 'KeywordTokenizer.rbbi'
|
||||
// Whitelist reindexing from the local node so we can test it.
|
||||
|
@ -249,6 +253,39 @@ buildRestTests.setups['host'] = '''
|
|||
- set: {nodes.$master.http.publish_address: host}
|
||||
'''
|
||||
|
||||
// Used by scripted metric docs
|
||||
buildRestTests.setups['ledger'] = '''
|
||||
- do:
|
||||
indices.create:
|
||||
index: ledger
|
||||
body:
|
||||
settings:
|
||||
number_of_shards: 2
|
||||
number_of_replicas: 1
|
||||
mappings:
|
||||
sale:
|
||||
properties:
|
||||
type:
|
||||
type: keyword
|
||||
amount:
|
||||
type: double
|
||||
- do:
|
||||
bulk:
|
||||
index: ledger
|
||||
type: item
|
||||
refresh: true
|
||||
body: |
|
||||
{"index":{}}
|
||||
{"date": "2015/01/01 00:00:00", "amount": 200, "type": "sale", "description": "something"}
|
||||
{"index":{}}
|
||||
{"date": "2015/01/01 00:00:00", "amount": 10, "type": "expense", "decription": "another thing"}
|
||||
{"index":{}}
|
||||
{"date": "2015/01/01 00:00:00", "amount": 150, "type": "sale", "description": "blah"}
|
||||
{"index":{}}
|
||||
{"date": "2015/01/01 00:00:00", "amount": 50, "type": "expense", "description": "cost of blah"}
|
||||
{"index":{}}
|
||||
{"date": "2015/01/01 00:00:00", "amount": 50, "type": "expense", "description": "advertisement"}'''
|
||||
|
||||
// Used by pipeline aggregation docs
|
||||
buildRestTests.setups['sales'] = '''
|
||||
- do:
|
||||
|
|
|
@ -9,6 +9,7 @@ Example:
|
|||
|
||||
[source,js]
|
||||
--------------------------------------------------
|
||||
POST ledger/_search?size=0
|
||||
{
|
||||
"query" : {
|
||||
"match_all" : {}
|
||||
|
@ -16,15 +17,17 @@ Example:
|
|||
"aggs": {
|
||||
"profit": {
|
||||
"scripted_metric": {
|
||||
"init_script" : "_agg['transactions'] = []",
|
||||
"map_script" : "if (doc['type'].value == \"sale\") { _agg.transactions.add(doc['amount'].value) } else { _agg.transactions.add(-1 * doc['amount'].value) }", <1>
|
||||
"combine_script" : "profit = 0; for (t in _agg.transactions) { profit += t }; return profit",
|
||||
"reduce_script" : "profit = 0; for (a in _aggs) { profit += a }; return profit"
|
||||
"init_script" : "params._agg.transactions = []",
|
||||
"map_script" : "params._agg.transactions.add(doc.type.value == 'sale' ? doc.amount.value : -1 * doc.amount.value)", <1>
|
||||
"combine_script" : "double profit = 0; for (t in params._agg.transactions) { profit += t } return profit",
|
||||
"reduce_script" : "double profit = 0; for (a in params._aggs) { profit += a } return profit"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
--------------------------------------------------
|
||||
// CONSOLE
|
||||
// TEST[setup:ledger]
|
||||
|
||||
<1> `map_script` is the only required parameter
|
||||
|
||||
|
@ -35,24 +38,24 @@ The response for the above aggregation:
|
|||
[source,js]
|
||||
--------------------------------------------------
|
||||
{
|
||||
"took": 218,
|
||||
...
|
||||
|
||||
"aggregations": {
|
||||
"profit": {
|
||||
"value": 170
|
||||
"value": 240.0
|
||||
}
|
||||
}
|
||||
}
|
||||
--------------------------------------------------
|
||||
// TESTRESPONSE[s/"took": 218/"took": $body.took/]
|
||||
// TESTRESPONSE[s/\.\.\./"_shards": $body._shards, "hits": $body.hits, "timed_out": false,/]
|
||||
|
||||
The above example can also be specified using file scripts as follows:
|
||||
|
||||
[source,js]
|
||||
--------------------------------------------------
|
||||
POST ledger/_search?size=0
|
||||
{
|
||||
"query" : {
|
||||
"match_all" : {}
|
||||
},
|
||||
"aggs": {
|
||||
"profit": {
|
||||
"scripted_metric": {
|
||||
|
@ -66,18 +69,42 @@ The above example can also be specified using file scripts as follows:
|
|||
"file": "my_combine_script"
|
||||
},
|
||||
"params": {
|
||||
"field": "amount" <1>
|
||||
"field": "amount", <1>
|
||||
"_agg": {} <2>
|
||||
},
|
||||
"reduce_script" : {
|
||||
"file": "my_reduce_script"
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
--------------------------------------------------
|
||||
// CONSOLE
|
||||
// TEST[setup:ledger]
|
||||
|
||||
<1> script parameters for init, map and combine scripts must be specified in a global `params` object so that it can be share between the scripts
|
||||
<1> script parameters for `init`, `map` and `combine` scripts must be specified
|
||||
in a global `params` object so that it can be share between the scripts.
|
||||
<2> if you specify script parameters then you must specify `"_agg": {}`.
|
||||
|
||||
////
|
||||
Verify this response as well but in a hidden block.
|
||||
|
||||
[source,js]
|
||||
--------------------------------------------------
|
||||
{
|
||||
"took": 218,
|
||||
...
|
||||
"aggregations": {
|
||||
"profit": {
|
||||
"value": 240.0
|
||||
}
|
||||
}
|
||||
}
|
||||
--------------------------------------------------
|
||||
// TESTRESPONSE[s/"took": 218/"took": $body.took/]
|
||||
// TESTRESPONSE[s/\.\.\./"_shards": $body._shards, "hits": $body.hits, "timed_out": false,/]
|
||||
////
|
||||
|
||||
For more details on specifying scripts see <<modules-scripting, script documentation>>.
|
||||
|
||||
|
@ -124,34 +151,17 @@ Imagine a situation where you index the following documents into and index with
|
|||
|
||||
[source,js]
|
||||
--------------------------------------------------
|
||||
$ curl -XPUT 'http://localhost:9200/transactions/stock/1' -d '
|
||||
{
|
||||
"type": "sale",
|
||||
"amount": 80
|
||||
}
|
||||
'
|
||||
|
||||
$ curl -XPUT 'http://localhost:9200/transactions/stock/2' -d '
|
||||
{
|
||||
"type": "cost",
|
||||
"amount": 10
|
||||
}
|
||||
'
|
||||
|
||||
$ curl -XPUT 'http://localhost:9200/transactions/stock/3' -d '
|
||||
{
|
||||
"type": "cost",
|
||||
"amount": 30
|
||||
}
|
||||
'
|
||||
|
||||
$ curl -XPUT 'http://localhost:9200/transactions/stock/4' -d '
|
||||
{
|
||||
"type": "sale",
|
||||
"amount": 130
|
||||
}
|
||||
'
|
||||
PUT /transactions/stock/_bulk?refresh
|
||||
{"index":{"_id":1}}
|
||||
{"type": "sale","amount": 80}
|
||||
{"index":{"_id":2}}
|
||||
{"type": "cost","amount": 10}
|
||||
{"index":{"_id":2}}
|
||||
{"type": "cost","amount": 30}
|
||||
{"index":{"_id":2}}
|
||||
{"type": "sale","amount": 130}
|
||||
--------------------------------------------------
|
||||
// CONSOLE
|
||||
|
||||
Lets say that documents 1 and 3 end up on shard A and documents 2 and 4 end up on shard B. The following is a breakdown of what the aggregation result is
|
||||
at each stage of the example above.
|
||||
|
@ -268,4 +278,3 @@ params:: Optional. An object whose contents will be passed as variable
|
|||
"_agg" : {}
|
||||
}
|
||||
--------------------------------------------------
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
double profit = 0;
|
||||
for (t in params._agg.transactions) {
|
||||
profit += t
|
||||
}
|
||||
return profit
|
|
@ -0,0 +1 @@
|
|||
params._agg.transactions = []
|
|
@ -0,0 +1 @@
|
|||
params._agg.transactions.add(doc.type.value == 'sale' ? doc.amount.value : -1 * doc.amount.value)
|
|
@ -0,0 +1,5 @@
|
|||
double profit = 0;
|
||||
for (a in params._aggs) {
|
||||
profit += a
|
||||
}
|
||||
return profit
|
Loading…
Reference in New Issue