У меня есть индекс с более чем 30 млн документов. Каждый документ имеет поле parentId и поле createOn. Модифицированные документы имеют поле Modified On. Даты хранятся как epoch_millis. Мне нужно найти 10 самых последних документов по parentId, если хотя бы один из «дочерних» документов был создан / изменен в пределах диапазона дат. Я пытался использовать составную агрегацию, но это займет слишком много времени.
{
"aggregations": {
"lists": {
"composite": {
"sources": [
{
"parentId": {
"terms": {
"field": "parentId"
}
}
}
],
"size": 10000
},
"aggregations": {
"most_recent": {
"max": {
"script": {
"source": "doc['modifiedOn'].size() == 0 || doc['modifiedOn'].value.millis == null ? doc['createdOn'].value.millis : doc['modifiedOn'].value.millis"
}
}
},
"most_recent_filter": {
"bucket_selector": {
"buckets_path": {
"modified_on": "most_recent"
},
"script": "params.modified_on >= 1552003847225L"
}
},
"top_items": {
"top_hits": {
"_source": [
"parentId",
"otherFields",
"createdOn",
"modifiedOn"
],
"sort": {
"_script": {
"type": "number",
"script": {
"source": "doc['modifiedOn'].size() == 0 || doc['modifiedOn'].value.millis == null ? doc['createdOn'].value.millis : doc['modifiedOn'].value.millis"
},
"order": "desc",
"mode": "max"
}
},
"size": 10
}
}
}
}
},
"size": 0
}
Есть ли лучший способ сделать это?