Uso di ElasticSearch 5.2
Ad esempio userò un database che rappresenta tutte le persone nel mondo.
Esempio di richiesta: ottieni lo stipendio medio di una persona, raggruppato per paese, per tutti di età superiore ai 30 anni. (La risposta dovrebbe contenere i primi 10 paesi con il loro stipendio medio)
Passi che ho preso per costruire la mia query di aggregazione:
- Filtrare il set di dati non elaborato (
filter: age > 30
) - Aggregato su "
country
" - Usa metrica media sul campo "
salary
"
Il problema che sto affrontando è che posso applicare un filtro prima di aggregarlo o ordinare i bucket, ma sembra che ES non mi consenta di fare entrambe le cose?
In altre parole: non posso applicare il mio "order
"query su"myInnerAggregation
"perché è preceduto da"myFilterAggregation
"
GET myIndex/_search
{
"size":0,
"aggs": {
"myAggregation": {
"terms": {
"size":10,
"field": "country",
"order": [
{
"myInnerAggregation": "desc"
// I cannot specify "myInnerAggregation" here, only
// "myFilterAggregation" (because it"s out of scope I guess)
}
]
},
"aggs": {
"myFilterAggregation": {
"filter": { /* age > 30 (filter syntax is not the problem)*/},
"aggs": {
"myInnerAggergation": {
"avg": {
"field": "salary"
}
}
}
}
}
}
} }
Ho visto che ES 6.1+ supporta "bucket_sort
", che probabilmente risolverebbe questo problema, ma non posso credere che una semplice aggregazione come questa non possa essere gestita da ES 5.2?
risposte:
0 per risposta № 1Questo dovrebbe fare il trucco:
"order": [
{
"MyFilterAggregation>MyInnerAggregation": "desc"
}
]
0 per risposta № 2
Prova a spostare il filtro su query
parte della richiesta. Non devi dichiarare il tuo filtro come aggregazione, le aggregazioni rispettano i filtri definiti nel query
parte della tua richiesta. Speriamo in questo modo di risolvere il problema.