Elasticsearch es el motor de búsqueda y análisis distribuido situado en el centro de la pila Elastic. Dicha pila además de Elasticsearch como motor de búsqueda tiene otras utilidades como Logstash y Beats que facilitan la recolección, la agregación, enriqueciendo los datos y almacenándolos en Elasticsearch, que es donde se realiza la indexación, la búsqueda y el análisis de esos datos. Kibana ofrece un entorno web que facilita la integración de las diferentes utilidades y permite un visionado fácil de los datos.
Elasticsearch proporciona búsqueda y análisis casi en tiempo real para todo tipo de datos. Teniendo texto estructurado o no estructurado, datos numéricos o datos geoespaciales, Elasticsearch puede almacenarlo eficientemente e indexarlo de una manera compatible con búsquedas rápidas. Puedes ir mucho más allá de la simple recuperación de datos y la información agregada para descubrir tendencias y patrones en los datos. Y a medida que el volumen de datos y consultas crece, la naturaleza distribuida de Elasticsearch permite que su despliegue crezca perfectamente una manera sencilla.
Aunque no todos los problemas son un problema de búsqueda, Elasticsearch ofrece velocidad y flexibilidad para manejar los datos en una amplia variedad de casos de uso:
- Añadir un cuadro de búsqueda a una aplicación o sitio web.
- Almacene y analice registros, métricas y datos de eventos de seguridad.
- Utilice el aprendizaje automático para modelar automáticamente el comportamiento de sus datos en tiempo real.
- Automatizar flujos de trabajo de negocios usando Elasticsearch como motor de almacenamiento.
- Gestionar, integrar y analizar la información espacial utilizando Elasticsearch como una Sistema de información (SIG).
- Almacenar y procesar datos genéticos utilizando Elasticsearch como herramienta de investigación bioinformática.
Elasticsearch es un almacén de documentos distribuida. En lugar de almacenar información como filas y columnas de datos, Elasticsearch almacena complejas estructuras de datos que han sido serializadas como documentos JSON. Cuando tenga varios nodos de Elasticsearch en un clúster, los documentos almacenados se distribuyen por todo el clúster y se puede acceder inmediatamente desde cualquier nodo.
Cuando se almacena un documento, se indexa y se puede consultar completamente casi en tiempo real, en menos de 1 segundo. Elasticsearch utiliza una estructura de datos llamada índice invertido que soporta búsquedas de texto completo muy rápidas. Un índice invertido enumera cada palabra única que aparece en cualquier documento e identifica todos los documentos donde la palabra aparece.
Un índice se puede considerar como una colección optimizada de documentos y cada uno de los documento es una colección de campos, que son los pares de clave <-> valor que contienen sus datos. Por defecto, Elasticsearch indexa todos los datos en todos los campos y cada campo indexado tiene una estructura de datos dedicada y optimizada. Por ejemplo, los campos de texto son almacenados en índices invertidos y los campos numéricos y geográficos (longitud, latitud) se almacenan en árboles BKD. La capacidad de utilizar las estructuras de datos por campo para ensamblar y devolver la búsqueda de resultados es lo que hace que Elasticsearch sea tan rápido.
Elasticsearch también tiene la capacidad de no tener esquemas, lo que significa que los documentos se pueden indexar sin especificar explícitamente cómo manejar cada uno de los diferentes campos que pueden aparecer en un documento. Cuando el mapeo dinámico está habilitado, Elasticsearch detecta y agrega automáticamente nuevos campos al índice. Este comportamiento predeterminado facilita la indexación y exploración de sus datos: solo comience a indexar documentos y Elasticsearch detectará y asignará valores booleanos, de punto flotante y enteros, fechas y cadenas a los tipos de datos de Elasticsearch apropiados.
Sin embargo, en última instancia, cada uno sabe más sobre sus datos y cómo quiere usarlos que Elasticsearch. Se pueden definir reglas para controlar el mapeo dinámico y definir mapeos explícitamente para tomar el control total de cómo se almacenan e indexan los campos.
Si bien se puede usar Elasticsearch como un almacén de documentos y recuperar documentos y sus metadatos, el poder real proviene de poder acceder fácilmente al conjunto completo de capacidades de búsqueda integradas en la biblioteca del motor de búsqueda Apache Lucene, que es sobre lo que está construido Elasticsearch.
Proporciona una API REST simple y coherente para administrar el clúster e indexar y buscar los datos. Con fines de prueba, puede enviar fácilmente solicitudes directamente desde la línea de comandos o a través de la consola de desarrollo en Kibana. Desde sus aplicaciones, puede usar el cliente de Elasticsearch para el lenguaje de programación de su elección: Java, JavaScript, Go, .NET, PHP, Perl, Python o Ruby.
Las API REST Elasticsearch soportan consultas estructuradas, consultas de texto completos y consultas complejas que combinan los dos. Las consultas estructuradas son similar a los tipos de consultas que puede construir en SQL. Por ejemplo, una búsqueda puede consistir en buscar los campos género y edad en el índice empleado y ordenar los resultados por la fecha de contratación. Las consultas de texto completo pueden encontrar todos los documentos de un índice en los que se encuentra la cadena de la consulta y los devuelve ordenados por relevancia.
Ojo, muy importante, no hay que confundir el concepto índice en Elasticsearch con lo que se conoce como índice en una base de datos. En una base de datos un índice es una columna o varias columnas que sirven para ordenar los datos para poder recuperarlos lo más rápidamente posible y en Elasticsearch lo que se llama índice es lo equivalente a lo que en una base de datos es una tabla.
Además de buscar términos individuales, puede realizar búsquedas de frases, búsquedas de similitudes, búsquedas de prefijo y obtener sugerencias de autocompletar.
¿Existen datos geoespaciales o numéricos que quieras buscar? Elasticsearch indexa datos no textuales en estructuras de datos optimizadas que admiten consultas geográficas y numéricas de alto rendimiento.
Se puede acceder a todas estas capacidades de búsqueda utilizando el lenguaje de consulta de estilo JSON completo de Elasticsearch ( Query DSL ). También puede crear consultas de estilo SQL para buscar y agregar datos de forma nativa dentro de Elasticsearch, y los controladores JDBC y ODBC permiten que una amplia gama de aplicaciones de terceros interactúen con Elasticsearch a través de SQL.
Las agregaciones de Elasticsearch le permiten crear resúmenes complejos de sus datos y obtener información sobre métricas, patrones y tendencias clave. En lugar de simplemente encontrar la proverbial «aguja en un pajar», las agregaciones le permiten responder preguntas como:
- ¿Cuántas agujas hay en el pajar?
- ¿Cuál es la longitud media de las agujas?
- ¿Cuál es la mediana de la longitud de las agujas desglosadas por fabricante?
- ¿Cuántas agujas se agregaron al pajar en cada uno de los últimos seis meses?
También puede usar agregaciones para responder preguntas más sutiles, como:
- ¿Cuáles son sus fabricantes de agujas más populares?
- ¿Hay algún grupo de agujas inusual o anómalo?
Debido a que las agregaciones aprovechan las mismas estructuras de datos utilizadas para la búsqueda, también son muy rápidas. Esto le permite analizar y visualizar sus datos en tiempo real. Sus informes y paneles se actualizan a medida que cambian sus datos para que pueda tomar medidas en función de la información más reciente.
Además, las agregaciones funcionan junto con las solicitudes de búsqueda. Puede buscar documentos, filtrar resultados y realizar análisis al mismo tiempo, en los mismos datos, en una sola solicitud. Y debido a que las agregaciones se calculan en el contexto de una búsqueda particular, no solo muestra un recuento de todas las agujas de tamaño 70, sino que muestra un recuento de las agujas de tamaño 70 que coinciden con los criterios de búsqueda de sus usuarios, por ejemplo, Todas las agujas de bordar antiadherentes de tamaño 70 .
Pero no sólo eso ¿quiere automatizar el análisis de sus datos de series temporales? Puede usar funciones de aprendizaje automático para crear líneas de base precisas del comportamiento normal en sus datos e identificar patrones anómalos. Con el aprendizaje automático, puede detectar:
- Anomalías relacionadas con desviaciones temporales en valores, conteos o frecuencias.
- Rareza estadística.
- Comportamientos inusuales para un miembro de una población.
¿Y la mejor parte? Puede hacerlo sin tener que especificar algoritmos, modelos u otras configuraciones relacionadas con la ciencia de datos.
Elasticsearch está diseñado para estar siempre disponible y escalar con sus necesidades. Lo hace al ser distribuido por la naturaleza. Puede agregar servidores (nodos) a un clúster para aumentar la capacidad y Elasticsearch distribuye automáticamente su carga de datos y consultas en todos los nodos disponibles. No es necesario revisar su aplicación, Elasticsearch sabe cómo equilibrar los clústeres de múltiples nodos para proporcionar escalabilidad y alta disponibilidad. Cuantos más nodos, mejor.
¿Como funciona esto? Por debajo, un índice de Elasticsearch es en realidad solo una agrupación lógica de uno o más fragmentos físicos, donde cada fragmento es en realidad un índice autónomo. Al distribuir los documentos en un índice en varios fragmentos y distribuir esos fragmentos en varios nodos, Elasticsearch puede garantizar la redundancia, lo que protege contra fallos de hardware y aumenta la capacidad de consulta a medida que se agregan nodos a un clúster. A medida que el clúster crece (o se reduce), Elasticsearch migra fragmentos automáticamente para reequilibrar el clúster.
Hay dos tipos de fragmentos: primarios y réplicas. Cada documento en un índice pertenece a un fragmento primario. Un fragmento de réplica es una copia de un fragmento principal. Las réplicas proporcionan copias redundantes de sus datos para protegerse contra fallos de hardware y aumentar la capacidad para atender solicitudes de lectura, como buscar o recuperar un documento.
La cantidad de fragmentos primarios en un índice se fija en el momento en que se crea un índice, pero la cantidad de fragmentos de réplica se puede cambiar en cualquier momento, sin interrumpir las operaciones de indexación o consulta.
Hay que llegar a un compromiso entre el tamaño del fragmento y la cantidad de ellos. Cuantos más fragmentos, más capacidad de cómputo para mantener tantos fragmentos. Si son menos fragmentos, pero más grandes, más tiempo llevará mover un fragmento desde un nodo a otro. Se aconseja tener fragmentos entre unos pocos gigas y unas decenas de gigas.
En caso de catástrofe, interesa tener uno de los nodos en otro lugar geográfico para que pueda dar servicio. Para ello existe lo que se llama CCR (Replicación entre clústeres) que sincroniza automáticamente los índices del clúster principal con uno secundario. La replicación es activa-pasiva de tal modo que el índice del nodo principal es el que manera todas las solicitudes de escritura, mientras que los pasivos son sólo lectura.