Вы можете делать интересные и, возможно, нежелательные вещи с помощью объединение показателей по сценарию. Они позволяют вам определять сценарии уменьшения карты, которые работают с вашими документами. Конечно, вы можете навлечь на себя неприятности.
Но просто чтобы посмотреть, смогу ли я это сделать, я создал простой индекс с одним осколком с данными, которые вы предоставили:
PUT /test_index
{"settings": {"number_of_shards": 1}}
POST /test_index/doc/_bulk
{"index":{"_id":1}}
{"num":1}
{"index":{"_id":2}}
{"num":4}
{"index":{"_id":3}}
{"num":2}
{"index":{"_id":4}}
{"num":4}
{"index":{"_id":5}}
{"num":5}
{"index":{"_id":6}}
{"num":3}
{"index":{"_id":7}}
{"num":3}
{"index":{"_id":8}}
{"num":2}
{"index":{"_id":9}}
{"num":1}
{"index":{"_id":10}}
{"num":4}
Затем я могу усреднить каждые два документа следующим образом:
POST /test_index/_search
{
"size": 0,
"aggs": {
"profit": {
"scripted_metric": {
"init_script" : "_agg['nums'] = []; _agg['avgs'] = [];",
"map_script" : "_agg.nums.add(doc['num'].value); if(_agg.nums.size() == 2){ _agg.avgs.add((_agg.nums[0] + _agg.nums[1])/2.0); _agg['nums'] = [];}",
"combine_script" : "return _agg.avgs",
"reduce_script" : "return _aggs"
}
}
}
}
...
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 10,
"max_score": 0,
"hits": []
},
"aggregations": {
"profit": {
"value": [
[
2.5,
3,
4,
2.5,
2.5
]
]
}
}
}
Кажется, он не соблюдает порядок сортировки в запросе, хотя, насколько я могу судить, результат детерминирован.
То, что я сделал здесь, работает только с одним осколком; вы, вероятно, могли бы как-то обобщить его, если бы хотели возиться с ним достаточно долго.
Кроме того, большой отказ от ответственности: делать это в производственной среде может быть плохой идеей. Вы хотели бы сначала протестировать такие вещи на небольших наборах данных, прежде чем вы можете привести к сбою кластера из-за ошибок нехватки памяти. Также используйте сценарии только в том случае, если ваш кластер не открыт для большого плохого Интернета.
Вот некоторый код, который я использовал, чтобы поиграть с ним:
http://sense.qbox.io/gist/c31f089e63200127fd9ca09992004db8bb11b890
person
Sloan Ahrens
schedule
24.11.2015