Если я правильно понял, что вы пытаетесь сделать, один из способов сделать это - использовать top_hits агрегации на условиях агрегация, которая полезна для группировки результатов по любым критериям, которые вы хотите, для каждого сегмента его родительской агрегации.Следуя вашему примеру, вы можете сделать что-то вроде
{
"aggs": {
"by_source_id": {
"terms": {
"field": "source_id"
},
"aggs": {
"most_recent": {
"top_hits": {
"sort": {
"created_on": "desc"
},
"size": 1
}
}
}
}
}
}
Таким образом, вы группируете по source_id, который создаст сегмент для каждого из них, а затем вы получите лучшие попадания для каждого сегмента в соответствии с сортировкой.критерии, установленные в аггре top_hits, в данном случае create_on .
Результат, который вы должны ожидать, будет примерно таким:
....
"buckets": [
{
"key": 3,
"doc_count": 2,
"most_recent": {
"hits": {
"total": 2,
"max_score": null,
"hits": [
{
"_index": "so_sample02",
"_type": "items",
"_id": "2",
"_score": null,
"_source": {
"created_on": "2018-05-01 07:00:01",
"source_id": 3,
"type": "a"
},
"sort": [
1525158001000
]
}
]
}
}
},
{
"key": 5,
"doc_count": 2, .... and so on
Обратите внимание, как внутри корзины, most_recent , мы получаем соответствующие хиты.Кроме того, вы можете ограничить количество возвращаемых полей, указав в top_hits agg "includes": ["fieldA", "fieldB" .. and so on]
Надеюсь, что это поможет.