Я хочу отфильтровать результаты составной агрегации, которая внутри имеет агрегацию top_hits. Поэтому я сначала группирую свои данные с помощью top_hits, а затем использую это как субагрегацию внутри моего составного агрегата, который имеет один источник на основе идентификатора, и я не знаю, как фильтровать эти сгруппированные результаты.
Я пытался использовать агрегацию фильтров, но я не уверен, поскольку композитная агрегация должна быть отцом всех агрегаций. Пробовал разные комбинации этих агрегаций, но ни одна из них не показывает мне результаты, как я хочу.
{
"size": 0,
"aggs": {
"grouped_data": {
"composite": {
"sources": [
{
"artifact": {
"terms": {
"field": "artifactId.keyword"
}
}
}
],
"size": 20
},
"aggs": {
"top_artifacts_hits": {
"top_hits": {
"size": 1,
"sort": [{
"initialDate": {
"order": "desc"
}
}]
}
}
}
}
}
}
Я пытался использовать query
API для фильтрации, но это не очень хороший вариант для меня, так как фильтры, которые я хочу применить, предназначены для сгруппированных результатов. Использование некоторого query
перед основным агрегацией делает сначала запрос ElasticSearch, а затем группу. Мне нужно, чтобы это было задом наперед. Я использую ES 6.3 под AWS.
Итак, мои документы выглядят примерно так:
{
"artifactId": "foo",
"clientId": "bar",
"artifactState": "foozz",
"initialDate": 1559745246
}
Что мне нужно сделать, так это получить последний artifactState
на основе initialDate
для каждого отдельного artifactId
, поэтому я использую top_hits + композитный.