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 hostname
x login error code
x 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 .raw
versã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.