Это не будет работать с terms
aggs. Вот что возможно при использовании безболезненных сценариев:
Индексирование - фактическое отображение может отличаться от сгенерированного по умолчанию (особенно для части .keyword
на rec_id
):
POST _bulk
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"100","cost":42}
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"200","cost":67}
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"200","cost":67}
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"200","cost":67}
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"400","cost":11}
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"400","cost":11}
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"500","cost":10}
{"index":{"_index":"uniques","_type":"_doc"}}
{"record_id":"600","cost":99}
Затем агрегирование
GET uniques/_search
{
"size": 0,
"aggs": {
"terms": {
"scripted_metric": {
"init_script": "state.id_map = [:]; state.sum = 0.0; state.elem_count = 0.0;",
"map_script": """
def id = doc['record_id.keyword'].value;
if (!state.id_map.containsKey(id)) {
state.id_map[id] = true;
state.elem_count++;
state.sum += doc['cost'].value;
}
""",
"combine_script": """
def sum = state.sum;
def avg = sum / state.elem_count;
def stats = [:];
stats.sum = sum;
stats.avg = avg;
return stats
""",
"reduce_script": "return states"
}
}
}
}
И уступает
...
"aggregations" : {
"terms" : {
"value" : [
{
"avg" : 45.8,
"sum" : 229.0
}
]
}
}