Explicación de las agregaciones de ElasticSearch

Explicación de las agregaciones de ElasticSearch

  • Inteligencia artificial
5 min de lectura Actualizado Jul 8, 2019

Puntos clave: Las agregaciones ElasticSearch Permite a los usuarios agrupar y analizar datos de forma similar a la funcionalidad GROUP BY de SQL, como contar visitas web de los logs. Estas operaciones pueden ser complejas, permitiendo consultas anidadas.

  • Las agregaciones pueden gestionar tipos numéricos y de palabras clave para un análisis eficiente de datos.
  • Los tipos comunes incluyen agregaciones de cubos para contar ocurrencias.

ElasticSearch te permite hacer el equivalente a un SQL GROUP BY COUNT y funciones AVERAGE. A estas se les llama agregaciones. En otras palabras, si te son mirando los logs del servidor web nginx te podría:

  • Agrupa cada registro de golpes web según la ciudad de donde proviene el usuario
  • Cuéntalos

Así que esto te daría algo como:

Ciudad Web Hits
París 20
Londres 30
Berlín 40

En SQL esto sería algo así como:

    select city, count(city) from logs
 group by city

Aquí ilustramos esto usando el caso de utiliza más sencillo: los logs web. Sigue la documentación anterior para llenar tu instancia de ElasticSearch con algunos logs del servidor web nginx si tú quieres seguir. Agregación Como ElasticSearch está preocupado por el rendimiento, son algunas reglas sobre qué tipo de campos te puedes agregar. te puede agrupar por cualquier campo numérico excepto por campos de texto que tienen que ser de tipo palabra clave o tener fielddata=true. te puede pensar en palabra clave como un índice. Cuando cargamos los datos nginx, no Crea el mapeo de índice primero. Dejamos que ElasticSearch construyera eso sobre la marcha. Así que eligió indexar todos los campos de texto ya que mapea los de palabra clave de tipo, así:

    "geoip" : {
          "dynamic" : "true",
          "properties" : {
            "city_name" : {
              "type" : "text",
              "norms" : false,
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }

Ahora, las agregaciones están un tema complicado. Hay son muchas variaciones. te pueden anidarlas para construir consultas complejas. Aquí analizamos el caso más simple y común utiliza: la agregación de cubos. Que están como la sentencia SQL select, count para producir un conteo por valor. En el ejemplo siguiente, queremos contar los resultados web por el nombre de la ciudad. El patrón general para construir la sentencia están:

  • Utiliza aggs, que están la abreviatura de agregaciones.
  • Dale un nombre al AGG. Aquí utilizamos CityName.
  • Dile qué campo usar. Aquí utiliza la notación de puntos geoip.city_name ya que city_name están una propiedad de geo_ip. En otras palabras, en una estructura JSON profundamente anidada, pon un punto como te bajar en la jerarquía. Para un array JSON, te utiliza scripting ElasticSearch, un tema que aún no hemos cubierto.
  • Añade la palabra clave para decirle que utilize ese índice.
  • Dámosle el tipo de operación de agregación. Aquí utiliza términos. te también puede utiliza averia (promedio) y algunos otros.

te también puede utiliza filtros, que ilustramos más adelante. Esta consulta produce un recuento de visitas web por ciudad.

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/logstash/_search?pretty -d '{
        "aggs": {
                "cityName": {
                        "terms": {
                                "field": "geoip.city_name.keyword",
                                "size": 10
                        }

Aquí son los resultados. Le dimos el tamaño por defecto de 10, es decir, hasta dónde debería llegar. Como tenemos 18 ciudades en nuestros datos, "sum_other_doc_count": 8 significa que dejó 8 registros. Recuerda que ElasticSearch tiene muchas reglas para mantener un alto rendimiento. Fíjate que debajo de cada uno con estos están un doc_count. Así que tuvimos 6 visitas web de la ciudad de Montpellier.

    "aggregations" : {
    "cityName" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 8,
      "buckets" : [
        {
          "key" : "Montpellier",
          "doc_count" : 6
        },
        {
          "key" : "Suzano",
          "doc_count" : 3
        },
        {
          "key" : "Boardman",
          "doc_count" : 2
        },
        {
          "key" : "Mazatlán",
          "doc_count" : 2
        },
        {
          "key" : "New York",
          "doc_count" : 2
        },
        {
          "key" : "San Diego",
          "doc_count" : 2
        },
        {
          "key" : "Abadan",
          "doc_count" : 1
        },
        {
          "key" : "Ashburn",
          "doc_count" : 1
        },
        {
          "key" : "Bogotá",
          "doc_count" : 1
        },
        {
          "key" : "Cambe",
          "doc_count" : 1
        }
      ]
    }
  }
}

Aquí contamos los mismos datos por respuesta, por ejemplo, 200, 404, etc. Como responder está de tipo largo, no es necesario añadir palabra clave al final.

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/logstash/_search?pretty -d '{
        "aggs": {
                "responses": {
                        "terms": {
                                "field": "response",
                                "size": 10
                        }
                }
        }
}'

Aquí son los resultados. Como solo son 4 tipos de respuestas en nuestros datos, mostró todas desde entonces están < 10.

    "aggregations" : {
    "responses" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 200,
          "doc_count" : 23
        },
        {
          "key" : 400,
          "doc_count" : 13
        },
        {
          "key" : 404,
          "doc_count" : 8
        },
        {
          "key" : 304,
          "doc_count" : 5
        }
      ]
    }
  }

Añadir una consulta

Aquí están un ejemplo usando una consulta para filtrar los resultados. Esto está basado en datos de interacciones de medicamentos de la FDA que exploraremos en nuestras próximas publicaciones sobre analítica. Esta consulta cuenta las interacciones farmacológicas por tipo de fármaco, que es el propósito principal de la base de datos de la FDA: rastrear interacciones y efectos secundarios de los medicamentos. Así que esto es una consulta y subconsulta de agregación de tipos de cubo

    curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/fda/_search?pretty -d '{
"query": {
    "term": {
      "patient.drug.medicinalproduct.keyword": {
        "value": "METRONIDAZOLE"
      }
    }
  },
      "aggs" : {
         "drug": {
             "terms" : {
                "field": "patient.drug.medicinalproduct.keyword"

           }
         },
         "adverseaffect" : {
             "terms" : {
               "field": "patient.reaction.reactionmeddrapt.keyword"
             }
       }
   }
}'

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de Inteligencia artificial

Suscríbete al Informe

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Gracias te

Tú te has suscrito a The Brief
El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.