/ / ElasticSearch - Aggregácie: filtrovanie a triedenie vedier - json, elasticsearch

ElasticSearch - Aggregácie: filtrovanie a triedenie vedier - json, elasticsearch

Používanie funkcie ElasticSearch 5.2

Ako príklad budem používať databázu zastupujúcu všetkých ľudí na svete.

Príklad žiadosti: Získajte priemerný plat osoby, zoskupenej podľa krajiny, pre všetkých starších ako 30 rokov. (Odpoveď by mala obsahovať prvých 10 krajín s priemerným platom)

Kroky, ktoré som si vybral na vytvorenie agregačného dotazu:

  1. Filtrovať surový súbor údajov (filter: age > 30)
  2. Agregovať na "country"
  3. Na políčku "salary"

Problémom, ktorým čelím, je, že môžem buď použiť filter pred zhromaždením, alebo triediť lopaty, ale zdá sa mi, že ES mi nedovolí robiť oboje?
Inými slovami: nemôžem použiť môj "order"dotaz na"myInnerAggregation"pretože" predchádza "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"
}
}
}
}
}
}

} }

Videl som, že ES 6.1+ podporuje "bucket_sort", čo by pravdepodobne vyriešilo tento problém, ale nemôžem uveriť, že jednoduchá agregácia, ako je táto, nemôže riešiť ES 5.2?

odpovede:

0 pre odpoveď č. 1

Toto by malo robiť trik:

"order": [
{
"MyFilterAggregation>MyInnerAggregation": "desc"
}
]

0 pre odpoveď č. 2

Skúste presunúť filter na query časť žiadosti. Nemusíte deklarovať filter ako agregáciu, agregácie sa týkajú filtrov definovaných v query časť vašej žiadosti. Dúfajme, že týmto spôsobom sa môžete dostať k problému.