/ / ElasticSearch - Agregacje: filtrowanie i sortowanie wiader - json, elasticsearch

ElasticSearch - Agregacje: filtrowanie i sortowanie wiader - json, elasticsearch

Korzystanie z ElasticSearch 5.2

Jako przykład wykorzystam bazę danych reprezentującą wszystkich ludzi na świecie.

Przykładowa prośba: Uzyskaj średnią pensję osoby, pogrupowaną według krajów, dla wszystkich osób w wieku powyżej 30 lat. (Odpowiedź powinna zawierać 10 najlepszych krajów ze średnią pensją)

Kroki, które podjąłem, aby zbudować moje zapytanie o agregację:

  1. Filtruj surowy zbiór danych (filter: age > 30)
  2. Zagreguj na "country"
  3. Użyj parametru Śr. W polu "salary"

Problem, przed którym stoję, polega na tym, że mogę zastosować filtr przed agregowaniem lub sortowaniem wiader, ale wydaje mi się, że ES nie pozwala mi na jedno i drugie?
Innymi słowy: nie mogę zastosować mojego "order"zapytanie na"myInnerAggregation"ponieważ jest poprzedzone"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"
}
}
}
}
}
}

} }

Przekonałem się, że ES 6.1+ ma wsparcie dla "bucket_sort", co prawdopodobnie rozwiązałoby ten problem, ale nie mogę uwierzyć, że proste agregowanie, takie jak to, nie może być obsługiwane przez ES 5.2?

Odpowiedzi:

0 dla odpowiedzi № 1

To powinno wystarczyć:

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

0 dla odpowiedzi nr 2

Spróbuj przenieść filtr do query część wniosku. Nie musisz deklarować swojego filtru jako agregacji, agregacje respektują filtry zdefiniowane w query część twojego żądania. Mam nadzieję, że w ten sposób rozwiążesz problem.