Elasticsearch ofrece a los desarrolladores el conjunto de herramientas de búsqueda más completo, desde la búsqueda vectorial hasta las potentes API REST. Descubre los cuadernos de muestra en GitHub para probar algo nuevo. También puedes iniciar tu prueba gratuita o ejecutar Elasticsearch localmente hoy mismo.
El uso de incrustaciones para mejorar la relevancia y precisión de la recuperación de información creció significativamente a lo largo de los años. Herramientas como Elasticsearch evolucionaron para soportar este tipo de datos mediante tipos de campos especializados como vectores densos, vectores dispersos y texto semántico. Sin embargo, para lograr buenos resultados, es esencial entender cómo mapear correctamente las incrustaciones a los tipos de campos disponibles de Elasticsearch: semantic_text, dense_vectory sparse_vector.
En este artículo, discutiremos estos tipos de campos, cuándo usar cada uno y cómo se relacionan con la generación y las estrategias de uso de incrustaciones, tanto durante la indexación como durante la consulta.
Tipo vectorial denso
El tipo de campo dense_vector en Elasticsearch se emplea para almacenar vectores densos, que son representaciones numéricas de datos como texto, imágenes y audio, donde casi todas las dimensiones son relevantes. Estos vectores se generan empleando modelos de incrustación proporcionados por plataformas como OpenAI, Cohere o Hugging Face, y están diseñados para captar el significado semántico general de los datos, incluso cuando no comparten términos exactos con otros documentos.
En Elasticsearch, los vectores densos pueden tener hasta 4096 dimensiones dependiendo del modelo empleado. Por ejemplo, el modelo totalmente MiniLM-L6-v2 genera vectores con 384 dimensiones, mientras que el text-embedding-ada-002 de OpenAI produce vectores con 1536 dimensiones.
El campo dense_vector se adopta comúnmente como el tipo predeterminado para almacenar este tipo de incrustación cuando se necesita mayor control, como usando vectores pregenerados, aplicando funciones de similitud personalizadas o integrando con modelos externos.
¿Cuándo y por qué usar dense_vector tipo?
Los vectores densos son excelentes para capturar similitudes semánticas entre oraciones, párrafos o documentos completos. Funcionan muy bien cuando el objetivo es comparar el significado general de los textos, aunque no compartan los mismos términos.
El campo vectorial denso es ideal cuando ya tienes una pipeline externa de generación de embedding usando modelos proporcionados por plataformas como OpenAI, Cohere o Hugging Face y solo quieres almacenar y consultar estos vectores manualmente. Este tipo de campo ofrece alta compatibilidad con modelos de incrustación y total flexibilidad en la generación y consulta, permitiéndote controlar cómo se producen, indexan y emplean los vectores durante la búsqueda.
Además, soporta diferentes formas de búsqueda semántica, con consultas como k-NN o script_score para casos en los que sea necesario ajustar la lógica de clasificación. Estas posibilidades hacen que el vector denso sea ideal para aplicaciones como RAG (Generación Aumentada por Recuperación), sistemas de recomendación y búsquedas personalizadas basadas en similitudes.
Por último, el campo te permite personalizar la lógica de relevancia, usando funciones como cosineSimilarity, dotProduct o l2norm para adaptar la clasificación según las necesidades de tu caso de uso.
Los vectores densos siguen siendo la mejor opción para quienes necesitan flexibilidad, personalización y compatibilidad con casos de uso avanzados como los mencionados anteriormente.
¿Cómo usar la consulta para el tipo de vector denso?
Las búsquedas en campos definidos como dense_vector emplean la consulta k-vecinos más cercanos. Esta consulta es responsable de encontrar documentos cuyo vector denso está más cercano al vector de consulta. A continuación se muestra un ejemplo de cómo aplicar una consulta k-NN a un campo vectorial denso:
Además de la consulta k-NN, si es necesario personalizar el puntaje del documento, también es posible usar la consulta script_score, combinándola con funciones de comparación vectorial como cosenoSimilitud, Producto PuntoPunto o l2norm para calcular la relevancia de forma más controlada. Mira el ejemplo:
Si quieres profundizar más, te recomiendo explorar el artículo Cómo configurar la búsqueda vectorial en Elasticsearch.
Tipo vectorial disperso
El tipo de campo sparse_vector se emplea para almacenar vectores dispersos, que son representaciones numéricas donde la mayoría de los valores son cero y solo unos pocos términos tienen pesos significativos. Este tipo de vector es común en modelos basados en términos como SPLADE o ELSER (Elastic Learned Sparse EncodeR).
¿Cuándo y por qué usar tipo vectorial disperso?
Los vectores dispersos son ideales cuando se necesita una búsqueda más precisa en términos léxicos, sin sacrificar la inteligencia semántica. Representan el texto como pares token/valor, resaltando solo los términos más relevantes con pesos asociados, lo que proporciona claridad, control y eficiencia.
Este tipo de campo es especialmente útil cuando se generan vectores basados en términos, como en los modelos ELSER o SPLADE, que asignan diferentes pesos a cada token según su importancia relativa en el texto.
Para las ocasiones en las que quieres controlar la influencia de palabras específicas en la consulta, los tipos vectoriales dispersos te permiten ajustar manualmente el peso de los términos para optimizar el orden de los resultados.
Entre los principales beneficios están la transparencia en la búsqueda, ya que es posible entender claramente por qué un documento se consideraba relevante, y la eficiencia de almacenamiento, ya que solo se almacenan los tokens con valor distinto de cero, a diferencia de los vectores densos que almacenan todas las dimensiones.
Además, los vectores dispersos son el complemento ideal en estrategias de búsqueda híbrida, e incluso pueden combinar con vectores densos para combinar precisión léxica con comprensión semántica.
¿Cómo usar la consulta para el tipo de vector disperso?
La consulta sparse_vector te permite buscar documentos basándote en un vector de consulta en formato token/valor. Consulta un ejemplo de la consulta a continuación:
Si prefieres usar un modelo capacitado, es posible emplear un punto final de inferencia que transforme automáticamente el texto de consulta en un vector disperso:
Para profundizar en este tema, sugiero leer Understanding sparse vector embeddings with trained ML models.
Tipo de texto semántico
El tipo de campo semantic_text es la forma más sencilla y directa de usar la búsqueda semántica en Elasticsearch. Gestiona automáticamente la generación de incrustaciones, tanto en tiempo de indexación como en tiempo de consulta, a través de un punto final de inferencia. Esto significa que no tienes que preocuparte por generar o almacenar vectores manualmente.
¿Cuándo y por qué usar texto semántico?
El campo semantic_text es ideal para quienes quieren empezar con el mínimo esfuerzo técnico y sin tener que manejar vectores manualmente. Este campo automatiza pasos como la generación de incrustaciones y el mapeo de búsqueda vectorial, haciendo que la configuración sea más rápida y cómoda.
Deberías considerar usar semantic_text cuando valoras la simplicidad y la abstracción, ya que elimina la complejidad de configurar manualmente mapeos, generación de incrustaciones y pipelines de ingestión. Solo tienes que seleccionar el modelo de inferencia, y Elasticsearch se encarga del resto.
Los principales beneficios incluyen la generación automática de incrustaciones, realizada tanto durante la indexación como durante la consulta, y el mapeo listo para usar, que viene preconfigurado para soportar el modelo de inferencia seleccionado.
Además, el campo ofrece soporte nativo para la división automática de textos largos (fragmentación de texto), permitiendo dividir textos grandes en pasajes más pequeños, cada uno con su propia incrustación, lo que mejora la precisión en la búsqueda. Esto aumenta enormemente la productividad, especialmente para equipos que quieren ofrecer valor rápidamente sin tener que lidiar con la ingeniería subyacente de la búsqueda semántica.
Sin embargo, aunque semantic_text proporciona rapidez y simplicidad, este enfoque tiene algunas limitaciones. Permite el uso de modelos estándar de mercado, siempre que estén disponibles como puntos finales de inferencia en Elasticsearch. Pero no soporta incrustaciones generadas externamente, como es posible con el campo dense_vector .
Si necesitas más control sobre cómo se generan los vectores, quieres usar tus propios embeddings o necesitas combinar varios campos para estrategias avanzadas, los campos dense_vector y sparse_vector ofrecen la flexibilidad necesaria para escenarios más personalizados o específicos de dominio.
Cómo usar la consulta para el tipo de texto semántico
Antes de semantic_text, era necesario usar una consulta diferente según el tipo de incrustación (densa o dispersa). Se empleaba una consulta sparse_vector para campos dispersos, mientras que dense_vector campos requerían consultas KNN.
Con el tipo de texto semántico, la búsqueda se realiza usando la consulta semántica, que genera automáticamente el vector de consulta y lo compara con las incrustaciones de los documentos indexados. El tipo semantic_text permite definir un extremo de inferencia para incrustar la consulta, pero si no se especifica ninguno, se aplicará el mismo punto final que se usa durante la indexación a la consulta.
Para saber más, te sugiero leer el artículo Elasticsearch nueva semantic_text mapeo: Simplificando la búsqueda semántica.
Conclusión
Al elegir cómo mapear incrustaciones en Elasticsearch, es esencial entender cómo quieres generar los vectores y qué nivel de control necesitas sobre ellos. Si buscas simplicidad, el campo de texto semántico permite una búsqueda semántica automática y escalable, lo que lo hace ideal para muchos casos de uso iniciales. Cuando se requiere más control, un rendimiento ajustado o integración con modelos personalizados, los campos vectoriales densos y dispersos proporcionan la flexibilidad necesaria.
El tipo de campo ideal depende de tu caso de uso, la infraestructura disponible y la madurez de tu pila de aprendizaje automático. Lo más importante es que Elastic ofrece las herramientas para construir sistemas de búsqueda modernos y altamente adaptables.
Referencias
- Tipo de campo de texto semántico
- Tipo de campo vectorial disperso
- Tipo de campo vectorial denso
- Consulta semántica
- Consulta vectorial dispersa
- Búsqueda kNN
- Mapeado de nuevas semantic_text de Elasticsearch: Simplificación de la búsqueda semántica
- Comprendiendo las incrustaciones de vectores dispersos con modelos de aprendizaje automático capacitados
Preguntas frecuentes
¿Qué es un tipo de campo dense_vector?
Un campo dense_vector almacena representaciones numéricas de datos (texto, imágenes, audio) donde casi todas las dimensiones contienen valores distintos de cero. Estos vectores capturan el significado semántico general, incluso sin compartir términos exactos.
¿Qué es un tipo de campo sparse_vector?
Un tipo de campo sparse_vector almacena representaciones numéricas donde la mayoría de los valores son cero y solo unos pocos términos tienen pesos significativos. Esto es común para los modelos basados en términos como ELSER o SPLADE. Estos vectores representan el texto como pares de token/peso, que destacan solo los términos más relevantes
¿Qué es un tipo de campo semantic_text?
Semantic_text es una abstracción que gestiona automáticamente la generación de incrustaciones tanto en el momento de la indexación como en el de la búsqueda a través de un punto final de inferencia. Elimina la necesidad de gestión manual de vectores o configuraciones complejas de pipelines de ingesta. También ofrece soporte nativo para la fragmentación automática de texto para documentos largos.
¿Cuándo usar qué tipo de campo en Elasticsearch?
Para simplificar: semantic_text es la "entrada fácil" que maneja todo, incluida la fragmentación automática de texto, de manera transparente. Para la personalización: dense_vector y sparse_vector son herramientas del "modo experto" para los equipos que deseen traer sus propias integraciones o crear sistemas de búsqueda híbridos complejos.




