Agregação de termos de vários níveis em elasticsearch

Se você deseja gerar uma “frequência cruzada / tabulação” de termos em elasticsearch, você escolheria uma agregação aninhada.

Aqui está um exemplo de agregação de três níveis que produzirá uma “tabela” de
hostnamex login error codex username. Esta é uma consulta que usei para gerar um relatório diário de falhas de login do OpenLDAP.

curl -XGET http://localhost:9200/logstash-*/_search?pretty=true -d '
{
"aggs" : {
"hostname_by_login_result": {
"terms": {
"field": "hostname.raw"
},
"aggs": {
"result_by_user": {
"terms": {
"field": "login_code",
"size": 0,
"order": { "_term" : "desc" }
},
"aggs": {
"username": {
"terms": {
"field": "username.raw",
"size": 0
}
}
}
}
}
}

}
}
'

Ao consultar a .rawversão de um campo, você obtém a versão “não analisada”, o que significa que seus dados não serão divididos em delimitadores.

Também quero que a saída seja classificada por código de erro de login decrescente, daí a opção de pedido:

...
"terms": {
"field": "login_code",
"size": 0,
"order": { "_term" : "desc" }
},
...

Por padrão, a saída é classificada pela contagem de documentos retornados, ou _count. Existem algumas opções de classificação intrínseca disponíveis, dependendo do tipo de consulta que você está executando.