¿Qué es un índice de Elasticsearch?

info-retrieval-blog-720x420-v2.jpeg

El término índice tiene una gran carga en el mundo técnico. 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 recopilación de documentos, donde cada documento es una recopilación de campos, los 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, en cada índice, tienes muchos documentos.   

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

Si bien Elasticsearch almacena documentos JSON, lo que ingresas en el índice es sumamente flexible. Ponerse en marcha con la gran cantidad de integraciones y Beats disponibles es un proceso rápido. O puedes ir un poco más allá y definir tus propios procesos de ETL con pipelines de ingesta o Logstash®, con la ayuda de sus diversos procesadores y plugins.

Otra diferencia con las bases de datos relacionales es que puedes importar datos sin necesidad de definir el esquema por anticipado. Los tipos de dinámica son una excelente forma de comenzar rápido o dar cuenta de campos inesperados en los documentos. Luego, cuando todo esté configurado, cambia a un esquema fijo para mejorar el rendimiento. 

Los campos de tiempo de ejecución son otra característica interesante que te permite usar esquema durante la lectura o escritura. Se pueden agregar a un documento existente y usar para derivar un campo nuevo, o puedes crear un campo de tiempo de ejecución al momento de la búsqueda. Piensa en ellos como valores calculados que usan scripting que puede leer la fuente del documento.

¿Estás listo para ver la diferencia en acción? Pruébalo gratis hoy con una cuenta de prueba en Elastic Cloud.

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

Elasticsearch proporciona una API basada en JSON RESTful para interactuar con los datos del documento. Puedes indexar, buscar, actualizar y eliminar documentos enviando solicitudes HTTP a los endpoints del cluster apropiado. Estas operaciones tipo CRUD pueden realizarse en el nivel de documento individual o en el nivel del índice en sí. Si lo prefieres, también hay bibliotecas de clientes específicas del lenguaje que puedes usar en lugar de REST directo.
El ejemplo siguiente crea un documento en un índice llamado playwrights con un document_id de 1. Observa que no necesitamos crear ningún esquema o configuración por anticipado, 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 distintos 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, puedes tener tablas distintas 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 económico que los costos informáticos de unir datos.

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

Cada índice se identifica con un nombre único y está dividido en uno o más shards, que son subconjuntos más pequeños del índice que permiten el procesamiento en paralelo y el almacenamiento distribuido en todo un cluster de nodos de Elasticsearch.  Los shards tienen un shard primario y uno réplica, las réplicas proporcionan copias redundantes de los datos a modo de protección contra fallas de hardware y aumentan la capacidad para prestar servicio a solicitudes de lectura, como búsqueda o recuperación de un documento.

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.

Retomemos el ejemplo de playwrights anterior. Si ejecutamos lo siguiente, podemos ver el tipo de mapeos que Elasticsearch infirió automáticamente y la cantidad de shards y réplicas que el índice asignó.

GET /es/playwrights/

¿Qué tipos de datos pueden indexarse en Elasticsearch?

Elasticsearch puede indexar muchos tipos de datos; principalmente datos de 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 incluye cada token único que aparece en cualquier documento e identifica todos los documentos en los que aparece cada palabra.

En la tabla siguiente se 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 lo que nos permite realizar búsquedas textuales con mucha rapidez.

Token

ID de documento

London

1,3,8,12,23,88

Paris

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 de BKD, también conocidos como índice de árbol Block KD, que son una estructura de datos usada en aplicaciones de ingeniería para indexación espacial eficiente y búsqueda en datos multidimensionales. Organizan los puntos de datos en bloques, lo que permite búsquedas de rango rápido y búsqueda de vecino más cercano en grandes sets de datos, lo cual los convierte en una herramienta valiosa para los ingenieros que trabajan con optimización y análisis de datos espaciales.

Búsqueda de vectores/semántica con NLP

Quizá escuchaste hablar de la búsqueda de vectores, ¿pero qué es? Los motores de búsqueda de vectores (conocidos como bases de datos de vectores, búsqueda semántica o búsqueda coseno) buscan el vecino más cercano de una búsqueda (vectorizada) dada. El poder de la búsqueda de vectores es que descubre documentos similares que no tienen coincidencia textual exacta, como requeriría nuestro ejemplo de índice invertido anterior; en cambio, usa vectores que describen cierto nivel de similitud. 

La comunidad de procesamiento del lenguaje natural (NLP) ha desarrollado una técnica llamada incrustación de texto que codifica palabras y oraciones como vectores numéricos. Estas representaciones vectoriales están diseñadas para capturar el contenido lingüístico del texto y se pueden usar para evaluar la similitud entre una búsqueda y un documento.

Algunos casos de uso comunes para la búsqueda de vectores son los siguientes: 

  • 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 busca canciones similares según tus preferencias  

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

Elasticsearch brinda soporte para la búsqueda de vectores a través del tipo de documento dense_vector y su capacidad de ejecutar búsquedas por similitud entre el vector en el documento y el término de búsqueda luego de que se convirtió en un vector. 

Para quienes quieran ahondar un poco en la AI generativa, también ofrecemos ESRE, Elasticsearch Relevance Engine™, diseñado para impulsar aplicaciones de búsqueda basadas en inteligencia artificial. ESRE brinda a los desarrolladores un conjunto completo de algoritmos de recuperación sofisticados y la capacidad de integración en modelos de lenguaje grandes.

¡Pruébalo!

Como puedes ver, los índices de Elasticsearch han avanzado mucho desde que el cofundador y gerente general de tecnología de Elastic Shay Banon escribió un motor de búsqueda de recetas para su esposa. Hay mucho más por descubrir, y un excelente lugar para comenzar es la creación de una cuenta de prueba en Elastic Cloud; estarás en marcha en minutos. Además, echa un vistazo al webinar de primeros pasos con Elasticsearch.

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