¿Qué es un índice de Elasticsearch?

El término índice tiene una gran carga en el mundo tecnológico. Si le preguntaras a la mayoría de los desarrolladores qué es un índice, quizá te digan que, por lo general, se refiere a una estructura de datos en una base de datos relacional (RDBMS) que está asociada a una tabla, que mejora la velocidad de las operaciones de recuperación de los datos.

¿Pero qué es un índice de Elasticsearch®? Un índice de Elasticsearch es un espacio de nombre lógico que contiene una colección de documentos, donde cada documento es una colección de campos que, a su vez, son pares de clave-valor que contienen tus datos.

¿En qué se diferencia un índice de Elasticsearch de una base de datos relacional?

Los índices de Elasticsearch no son los mismos que encontrarías en una base de datos relacional. Piensa en un cluster de Elasticsearch como una base de datos que puede contener muchos índices que puedes considerar como una tabla, y dentro de cada índice, tienes muchos documentos.   

  • RDBMS => Bases de datos => Tablas => Columnas/Filas
  • Elasticsearch => Clusters => Índices => Shards => Documentos con pares clave-valor

Aunque Elasticsearch almacena documentos JSON, lo que puedes ingresar en el índice es increíblemente flexible. Ponerlo en marcha es muy rápido gracias a la gran variedad de integraciones y Beats disponibles. O puedes ir un poco más allá y definir tus propios procesos ETL usando Ingest Pipelines o Logstash®, con la ayuda de sus numerosos procesadores y plugins.

Otra desviación de las bases de datos relacionales es que puedes importar datos sin necesidad de ninguna definición de esquema por adelantado. Los tipos dinámicos son una excelente manera de comenzar rápidamente o de tener en cuenta los campos inesperados en los documentos. Luego, una vez que tengas las cosas configuradas, cambia a un esquema fijo para mejorar el rendimiento. 

Los campos en tiempo de ejecución son otra característica interesante que te permite definir el esquema al leer o escribir. Se pueden añadir a un documento ya existente y usarse para derivar un nuevo campo, o puedes crear un campo en tiempo de ejecución en el momento de la consulta. Piensa en ellos como valores calculados mediante scripts que pueden leer el contenido del documento.

Descubre ahora mismo la diferencia entre Elasticsearch y las bases de datos relacionales. Pruébalas gratis hoy mismo con una cuenta de prueba en Elastic Cloud.

Cómo los datos interactúan con la API fácil de usar de Elasticsearch

Elasticsearch ofrece una API RESTful basada en JSON para interactuar con los datos de los documentos. Puedes indexar, buscar, actualizar y eliminar documentos enviando solicitudes HTTP a los endpoints correspondientes del cluster. Estas operaciones de tipo CRUD pueden realizarse tanto a nivel de documento individual como a nivel del propio índice. Si lo prefieres, también hay bibliotecas de cliente específicas para cada idioma que puedes usar en lugar de la API REST directa.
El siguiente ejemplo crea un documento en un índice llamado playwrights con un document_id asignado de 1. Observa que no necesitamos crear ningún esquema o configuración por adelantado; simplemente insertamos nuestros datos.

POST /playwrights/_doc/1
{
  "firstname": "William",
  "lastname": "Shakespeare"
}

Podemos agregar más documentos y campos, según queramos, lo que no es fácil de hacer con una base de datos relacional.

POST /playwrights/_doc/2
{
  "firstname": "Samuel",
  "lastname": "Beckett",
  "year_of_birth": 1906
}

Ahora podemos buscar en todos los documentos usando el endpoint de búsqueda.

GET /playwrights/_search
{
    "query": {
        "match_all": {}
    }
}

O podemos buscar un año de nacimiento específico.

GET /playwrights/_search
{
    "query": {
        “match": {
            “year_of_birth": 1906
        }
    }
}

Además de las búsquedas básicas, Elasticsearch proporciona características de búsqueda avanzadas, como coincidencias aproximadas, derivación, relevancia, resaltado y tokenización, que divide el texto en fragmentos más pequeños denominados tokens. En la mayoría de los casos, estos tokens son palabras individuales, pero hay muchos tokenizadores diferentes disponibles.

¿Por qué los datos desnormalizados son clave para una recuperación de datos más rápida?

En bases de datos relacionales, la normalización se suele aplicar para eliminar la redundancia de datos y garantizar la consistencia de los datos. Por ejemplo, podrías tener tablas separadas para clientes, productos y pedidos. 

En Elasticsearch, la desnormalización es una práctica común. En lugar de dividir los datos en varias tablas, almacenas toda la información relevante en un solo documento de JSON. Un documento de pedido contendría la información del cliente y del producto, en lugar de poseer claves externas que hacen referencia a distintos índices de productos y clientes. Esto permite una recuperación más rápida y eficiente de los datos en Elasticsearch durante las operaciones de búsqueda. Como regla general, el almacenamiento puede ser más barato que los costos de cómputo para unir datos.

¿Cómo asegura Elasticsearch la escalabilidad en los sistemas distribuidos?

Cada índice se identifica con un nombre único y se divide en uno o más shards, que son subconjuntos más pequeños del índice y permiten el procesamiento paralelo y el almacenamiento distribuido en un clúster de nodos de Elasticsearch. Los shards tienen un shard principal y una réplica; las réplicas brindan copias redundantes de tus datos para protegerte contra fallas de hardware y aumentar la capacidad de atender solicitudes de lectura, como búsquedas o la recuperación de documentos.

Agregar más nodos en el cluster te brinda mayor capacidad para indexar y buscar, algo que no se logra con tanta facilidad con una base de datos relacional.

Retomando nuestro ejemplo de playwrights anterior, si ejecutamos lo siguiente, podemos ver los mapeos de tipo que Elasticsearch infirió automáticamente y la cantidad de shards y réplicas que el índice ha asignado.

GET /playwrights/

¿Qué tipos de datos pueden indexarse en Elasticsearch?

Elasticsearch puede indexar muchos tipos de datos, principalmente texto, pero también datos numéricos y de geolocalización. Puede almacenar vectores densos que se usan en búsquedas similares. Veamos cada uno de ellos.

Índices invertidos para búsqueda de texto/léxica

Elasticsearch también elegirá la mejor estructura de datos subyacente para usar en un tipo de campo particular. Por ejemplo, el texto se tokenizaría y luego se almacenaría en un índice invertido, que es una estructura que lista cada token único que aparece en cualquier documento e identifica todos los documentos en los que aparece cada palabra.

La tabla siguiente muestra la composición general de un índice invertido. Podemos ver que si buscáramos el término "London", encontramos que aparece en seis documentos distintos en el índice. Este índice invertido es lo que nos permite realizar búsquedas textuales con mucha rapidez.

Token

ID de documento

London

1,3,8,12,23,88

París

1,12,88

Madrid3,8,12
Berlin12,23

Capacidades de búsqueda numéricas y de geolocalización para un análisis espacial eficiente

Los datos numéricos y de geolocalización se almacenarían en árboles BKD, también conocidos como índice de árbol BKD, que es una estructura de datos utilizada en aplicaciones de ingeniería para la indexación espacial eficiente y la consulta de datos multidimensionales. Organiza los puntos de datos en bloques, lo que permite búsquedas de rango rápido y búsquedas de vecino más cercano en grandes sets de datos, lo cual lo convierte en una herramienta valiosa para los ingenieros que trabajan con optimización y análisis de datos espaciales.

Búsqueda vectorial/semántica con NLP

Puede que hayas oído hablar de la búsqueda vectorial, pero ¿qué es? Los motores de búsqueda vectorial, conocidos como bases de datos vectoriales, búsqueda semántica o coseno, encuentran los vecinos más cercanos a una determinada consulta (vectorizada). El poder de la búsqueda vectorial es que descubre documentos similares que no son una coincidencia textual exacta, como requeriría nuestro ejemplo de índice invertido anterior; en su lugar, usa vectores que describen algún nivel de similitud. 

Relacionado: ¿Qué es la búsqueda vectorial?

Algunos casos de uso comunes para la búsqueda vectorial son: 

  • Responder preguntas
  • Encontrar respuestas a preguntas ya respondidas, donde la pregunta realizada sea similar, pero no exactamente igual de forma textual 
  • Hacer recomendaciones, por ejemplo, una aplicación de música que encuentra canciones similares según tus preferencias  

Todos estos casos de uso aprovechan vectores con decenas de miles de dimensiones, lo cual ofrece una representación integral de los datos para una evaluación precisa de similitud y recomendaciones dirigidas. 

Elasticsearch soporta la búsqueda vectorial a través del tipo dense_vector documento y su capacidad para realizar búsquedas de similitud entre el vector del documento y el término de búsqueda una vez que fue convertido en vector.

Para aquellos que quieran profundizar un poco más en la IA generativa, también ofrecemos ESRE, el Elasticsearch Relevance Engine™ , diseñado para potenciar aplicaciones de búsqueda basadas en inteligencia artificial. ESRE ofrece a los desarrolladores un conjunto completo de sofisticados algoritmos de recuperación y la capacidad de integrar con modelos de lenguaje grandes.

¿Que deberías hacer a continuación?

Cuando estés listo, aquí tienes tres maneras en las que podemos ayudarte a incorporar datos a tu negocio:

  1. Empieza una prueba gratuita y descubre cómo Elastic Cloud puede ayudar a tu empresa.
  2. Echa un vistazo al webinar Primeros pasos con Elasticsearch
  3. Descubre nuestros productos para ver cómo funciona Elasticsearch Platform y cómo nuestras soluciones se adaptarán a tus necesidades.

 

Publicado originalmente el 24 de febrero de 2013; actualizado el 17 de julio de 2023.