对于scripted metric aggregation,在文档中显示的示例中,combine脚本返回一个数字。
相反,我可以传递数组或哈希吗? 我试过这样做,虽然它没有返回任何错误,我无法从reduce脚本访问这些值。 在每个分片的reduce脚本中,当转换为字符串时,我得到一个实例,读作'Script2 $ _run_closure1 @ 52ef3bd9'
如果能以任何方式完成,请告诉我。
答案 0 :(得分:0)
至少对于Elasticsearch
版本1.5.1,您可以这样做。
例如,我们可以修改Elasticsearch
示例(scripted metric aggregation)以获得平均利润(利润除以交易次数):
{
"query": {
"match_all": {}
},
"aggs": {
"avg_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) }",
"combine_script": "profit = 0; num_of_transactions = 0; for (t in _agg.transactions) { profit += t; num_of_transactions += 1 }; return [profit, num_of_transactions]",
"reduce_script": "profit = 0; num_of_transactions = 0; for (a in _aggs) { profit += a[0] as int; num_of_transactions += a[1] as int }; return profit / num_of_transactions as float"
}
}
}
}
注意:这只是组合脚本中数组的演示,您可以轻松地计算平均值而无需使用任何数组。
响应如下:
"aggregations" : {
"avg_profit" : {
"value" : 42.5
}
}