/ / ElasticSearch - Agregações: filtrando e classificando baldes - json, elasticsearch

ElasticSearch - Agregações: filtrando e classificando baldes - json, elasticsearch

Usando o ElasticSearch 5.2

Como exemplo, vou usar um banco de dados representando todas as pessoas do mundo.

Exemplo de solicitação: obtenha o salário médio de uma pessoa, agrupado por país, para todas as pessoas com mais de 30 anos. (A resposta deve conter os 10 principais países com seu salário médio)

Etapas que tomei para criar minha consulta de agregação:

  1. Filtrar o conjunto de dados brutos (filter: age > 30)
  2. Agregado em "country"
  3. Use métrica Avg no campo "salary"

O problema que estou enfrentando é que eu posso aplicar um filtro antes de agregar ou classificar os intervalos, mas parece que ES não me permite fazer as duas coisas?
Em outras palavras: não posso aplicar meu "order"consulta em"myInnerAggregation"porque é precedido por"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"
}
}
}
}
}
}

} }

Eu vi que ES 6.1 + tem suporte para "bucket_sort", o que provavelmente resolveria esse problema, mas não posso acreditar que uma agregação simples como essa não possa ser tratada pelo ES 5.2?

Respostas:

0 para resposta № 1

Isso deve fazer o truque:

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

0 para resposta № 2

Tente mover o filtro para o query parte do pedido. Você não precisa declarar seu filtro como uma agregação, as agregações respeitam os filtros definidos no query parte do seu pedido. Espero que desta forma você possa contornar o seu problema.