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.
La búsqueda es el proceso de localizar la información más relevante basar en tu consulta de búsqueda o en la combinación de consultas y resultados de búsqueda relevantes son documentos que mejor se ajustan a estas consultas. Aunque existen varios desafíos y métodos asociados a la búsqueda, el objetivo final sigue siendo el mismo: encontrar la mejor respuesta posible a tu pregunta.
Teniendo en cuenta este objetivo, en esta entrada de blog exploraremos diferentes enfoques para recuperar información usando Elasticsearch, con un enfoque específico en la búsqueda de texto: búsqueda léxica y semántica.
Prerrequisitos
Para lograrlo, proporcionaremos ejemplos en Python que demuestren diversos escenarios de búsqueda en un conjunto de datos generado para simular información de productos de comercio electrónico.
Este conjunto de datos contiene más de 2.500 productos, cada uno con una descripción. Estos productos se clasifican en 76 categorías distintas, cada una conteniendo un número variable de productos, como se muestra a continuación:

Visualización de treemap: 22 valores principales de category.keyword (categorías de productos)
Para la configuración necesitarás:
- Python 3.6 o posterior
- El cliente Python Elástico
- Despliegue Elastic 8.8 o posterior, con nodo de aprendizaje automático de 8GB de memoria
- El modelo Elastic Learned Sparse EncodeR , que viene preinstalado en Elastic, se instaló y comenzó en tu despliegue
Usaremos Elastic Cloud, hay una prueba gratis disponible.
Además de las consultas de búsqueda que se proporcionan en esta entrada del blog, un cuaderno de Python te guiará a través de los siguientes procesos:
- Establece una conexión con nuestro despliegue de Elastic usando el cliente de Python
- Carga un modelo de incrustación de texto en el clúster de Elasticsearch
- Crea un índice con mapeos para indexar vectores de características y vectores densos.
- Crear una tubería de ingesta con procesadores de inferencia para incrustación y expansión de texto

Búsqueda léxica - recuperación dispersa
La forma tradicional en que los documentos se clasifican para relevancia según Elasticsearch basar en una consulta de texto emplea la implementación Lucene del modelo BM25 , un modelo disperso para la búsqueda léxica. Este método sigue el enfoque tradicional de búsqueda de texto, buscando coincidencias exactas de términos.
Para hacer posible esta búsqueda, Elasticsearch convierte los datos de los campos de texto en un formato buscable mediante análisis de texto.
El análisis de texto se realiza mediante un analizador, un conjunto de reglas que regulan el proceso de extracción de tokens relevantes para la búsqueda. Un analizador debe tener exactamente un tokenizador. El tokenizador recibe una secuencia de caracteres y la divide en fichas individuales (normalmente palabras individuales), como en el ejemplo siguiente:
Tokenización de cadenas para búsqueda léxica
Salida
En este ejemplo estamos usando el analizador por defecto, el analizador estándar , que funciona bien para la mayoría de los casos de uso ya que proporciona tokenización basada en gramática inglesa. La tokenización permite la coincidencia en términos individuales, pero cada token sigue siendo emparejado literalmente.
Si quieres personalizar tu experiencia de búsqueda, puedes elegir otro analizador integrado diferente. Por ejemplo, actualizando el código para usar el analizador de atajada , se descompone el texto en tokens en cualquier carácter que no sea letra, con soporte para eliminar palabras de atajada.
Salida
Cuando los analizadores integrados no satisfacen tus necesidades, puedes crear un analizador personalizado, que emplee la combinación adecuada de filtros de cero o más caracteres, un tokenizador y filtros de cero o más tokens.
En el ejemplo anterior, que combina un tokenizador y filtros de token, el texto se pondrá en minúsculas con el filtro minúsculo antes de ser procesado por el filtro de sinónimos.
Emparejamiento léxico
BM25 medirá la relevancia de los documentos para una consulta de búsqueda determinada en función de la frecuencia de los términos y su importancia.
El código siguiente realiza una consulta de coincidencia, buscando hasta dos documentos que consideren los valores del campo "descripción" del índice "ecommerce-search" y la consulta de búsqueda "Muebles cómodos para un balcón grande".
Refinar los criterios para que un documento se considere compatible con esta consulta puede mejorar la precisión. Sin embargo, los resultados más específicos tienen el costo de una menor tolerancia a las variaciones.
Salida
Analizando el resultado, el resultado más relevante es el producto "Barbie Dreamhouse", en la categoría "Juguetes", y su descripción es muy relevante ya que incluye los términos "muebles", "grande" y "balcón";este es el único producto con 3 términos en la descripción que coinciden con la consulta de búsqueda, El producto es también el único que tiene el término "balcón" en la descripción.
El segundo producto más relevante es una "Mecedora Cómoda" categorizada como "Mobiliario de Interior" y su descripción incluye los términos "cómodo" y "mueble". Solo 3 productos en el conjunto de datos coinciden con al menos 2 términos de esta consulta de búsqueda, este producto es uno de ellos.
"Cómodo" aparece en la descripción de 105 productos y "muebles" en la descripción de 4 productos con 4 categorías diferentes: Juguetes, Muebles de interior, Muebles de exterior y 'Suministros y Juguetes para perros y gatos'.
Como puedes ver, el producto más relevante para la pregunta es un juguete y el segundo producto más relevante son los muebles de interior. Si quieres información detallada sobre el cálculo de puntaje para saber por qué estos documentos coinciden, puedes poner el parámetro de explicación __query en verdadero.
A pesar de que ambos resultados son los más relevantes, considerando tanto el número de documentos como la presencia de términos en este conjunto de datos, la intención detrás de la consulta "Cómodos muebles para un balcón grande" es buscar muebles para un balcón grande real, excluyendo, entre otros, juguetes y muebles de interior.
La búsqueda léxica es relativamente sencilla y rápida, pero tiene limitaciones ya que no siempre es posible conocer todos los términos y sinónimos posibles sin necesariamente conocer la intención y las consultas del usuario. Un fenómeno común en el uso del lenguaje natural es la desadaptación del vocabulario. Las investigaciones muestran que, de media, el 80% de las veces diferentes personas (expertos en el mismo campo) nombran el mismo nombre de forma distinta.
Estas limitaciones nos motivan a buscar otros modelos de puntaje que incorporen conocimientos semánticos. Los modelos basados en transformadores, que destacan en el procesamiento de tokens de entrada secuenciales como el lenguaje natural, capturan el significado subyacente de tu búsqueda considerando representaciones matemáticas tanto de documentos como de consultas. Esto permite una representación vectorial densa y consciente del contexto del texto, impulsando la Búsqueda Semántica, una forma refinada de encontrar contenido relevante.
Búsqueda semántica - recuperación densa
En este contexto, tras convertir tus datos en valores vectoriales significativos, se emplea el algoritmo de búsqueda de k-vecinos más cercanos (kNN) para encontrar representaciones vectoriales en un conjunto de datos que sean más similares a un vector de consulta. Elasticsearch soporta dos métodos para la búsqueda en kNN: kNN exacto de fuerza bruta y kNN aproximado, también conocido como ANN.
La kNN de fuerza bruta garantiza resultados precisos pero no escala bien con grandes conjuntos de datos. El kNN aproximado encuentra eficientemente a los vecinos más cercanos sacrificando cierta precisión para mejorar el rendimiento.
Con el soporte de Lucene para la búsqueda kNN y los índices vectoriales densos, Elasticsearch aprovecha el algoritmo Hierarchical Navigable Small World (HNSW), que demuestra un rendimiento estable en búsquedas en una variedad de conjuntos de datos ann-benchmark. Se puede realizar una búsqueda aproximada de kNN en Python usando el código de ejemplo siguiente.
Búsqueda semántica con kNN aproximado
Este bloque de código emplea kNN de Elasticsearch para devolver hasta dos productos con una descripción similar a la consulta vectorizada (query_vector_build) de "Cómodo mobiliario para un balcón grande" considerando las incrustaciones del campo "descripción" en el conjunto de datos de productos.
Las incrustaciones de productos se generaban previamente en una tubería de ingesta con un procesador de inferencia que contenía el modelo de incrustación de texto "all-mpnet-base-v2" para inferir contra los datos que se estaban ingeriendo en la canalización.
Este modelo se eligió basar en la evaluación de modelos preentrenados usando "sentence_transformers.evaluation" donde se emplean diferentes clases para evaluar un modelo durante el entrenamiento. El modelo "all-mpnet-base-v2" mostró el mejor rendimiento medio según la clasificación de Sentence-Transformers y también cercioró una posición favorable en la tabla de clasificación del Massive Text Embedding Benchmark (MTEB ). El modelo preentrenado es Microsoft y mpnet-base y ajustado finamente en un conjunto de datos de pares de oraciones de 1B, que mapea oraciones a un espacio vectorial denso de 768 dimensiones.
Alternativamente, existen muchos otros modelos disponibles que se pueden emplear, especialmente aquellos ajustados para los datos específicos de tu dominio.
Salida
La salida puede variar según el modelo elegido, los filtros y la afinación aproximada de kNN.
Los resultados de búsqueda de kNN están ambos en la categoría de "Muebles de exterior", aunque la palabra "exterior" no se mencionó explícitamente en la consulta, lo que resalta la importancia de la comprensión semántica en este contexto.
La búsqueda vectorial densa ofrece varios beneficios:
- Activación de la búsqueda semántica
- Escalabilidad para manejar conjuntos de datos muy grandes
- Flexibilidad para manejar una amplia variedad de tipos de datos
Sin embargo, la búsqueda vectorial densa también conlleva sus propios desafíos:
- Seleccionar el modelo de incrustación adecuado para tu caso de uso
- Una vez elegido un modelo, puede ser necesario ajustarlo para optimizar el rendimiento en un conjunto de datos específico de un dominio, un proceso que requiere la participación de expertos en el dominio
- Además, indexar vectores de alta dimensión puede ser computacionalmente costoso
Búsqueda semántica - recuperación escasa aprendida
Exploremos un enfoque alternativo: la recuperación esparsa aprendida, otra forma de realizar búsqueda semántica.
Como modelo escaso, emplea el índice invertido basado en Lucene de Elasticsearch, que se beneficia de décadas de optimizaciones. Sin embargo, este enfoque va más allá de simplemente agregar sinónimos con funciones de puntaje léxico como BM25. En su lugar, incorpora asociaciones aprendidas empleando un conocimiento más profundo a escala del lenguaje para optimizar su relevancia.
Al ampliar las consultas de búsqueda para incluir términos relevantes que no están presentes en la consulta original, el Codificador Escaso Aprendido Elástico mejora las incrustaciones vectoriales dispersas, como puedes ver en el ejemplo siguiente.
Búsqueda vectorial dispersa con codificador elástico aprendido de dispersión
Salida
Los resultados en este caso incluyen la categoría "Muebles de jardín", que ofrece productos bastante similares a los "Muebles de Exterior".
Analizando "ml.tokens", el campo "rank_features" que contiene tokens generados por Recuperación Escasa Aprendida, se hace evidente que entre los diversos tokens generados hay términos que, aunque no forman parte de la consulta de búsqueda, siguen siendo relevantes en su significado, como "relax" (cómodo), "sofá" (muebles) y "exterior" (balcón).
La imagen de abajo destaca algunos de estos términos junto con la consulta, tanto con como sin ampliación de términos.

Como se observó, este modelo proporciona una búsqueda consciente del contexto y ayuda a mitigar el problema de la descoordinación de vocabulario, a la vez que proporciona resultados más interpretables. Incluso puede superar a los modelos vectoriales densos cuando no se aplica un reentrenamiento específico de dominio.
Búsqueda híbrida: resultados relevantes combinando la búsqueda léxica y semántica
Cuando se trata de búsqueda, no hay una solución universal. Cada uno de estos métodos de recuperación tiene sus fortalezas pero también sus desafíos. Dependiendo del caso de uso, la mejor opción puede cambiar. A menudo, los mejores resultados entre los métodos de recuperación pueden ser complementarios. Por tanto, para mejorar la relevancia, veremos la combinación de las fortalezas de cada método.
Existen múltiples formas de implementar una búsqueda híbrida, incluyendo la combinación lineal, que da un peso a cada puntaje y la fusión recíproca de rangos (RRF), donde no es necesario especificar un peso.
Elasticsearch: lo mejor de ambos mundos con búsqueda léxica y semántica
En este código, realizamos una búsqueda híbrida con dos consultas que tenían el valor "Una mesa de comedor y sillas cómodas para un balcón grande". En lugar de usar "muebles" como término de búsqueda, especificamos lo que buscamos, y ambas búsquedas consideran los mismos valores de campo, "descripción". La clasificación se determina mediante una combinación lineal con el mismo peso para los puntajes BM25 y ELSER.
Salida
En el código siguiente, usaremos el mismo valor para la consulta, pero combinaremos los puntajes de BM25 (parámetro de consulta) y kNN (parámetro knn) usando el método de fusión de rangos recíprocos para combinar y clasificar los documentos.
La funcionalidad de RRF está en vista previa técnica. La sintaxis probablemente cambiará antes de GA.
Salida
Aquí también podríamos usar diferentes campos y valores; algunos de estos ejemplos están disponibles en el cuaderno de Python.
Como puedes ver, con Elasticsearch tienes lo mejor de ambos mundos: la búsqueda léxica tradicional y la búsqueda vectorial, ya sea escasa o densa, para alcanzar tu objetivo y encontrar la mejor respuesta posible a tu pregunta.
Si quieres seguir aprendiendo sobre los enfoques mencionados aquí, estos blogs pueden ser útiles:
- Mejorar la recuperación de información en el Elastic Stack: Recuperación híbrida
- Búsqueda vectorial en Elasticsearch: La razón detrás del diseño
- Cómo obtener lo mejor de la búsqueda léxica y basada en IA con la base de datos vectorial de Elastic
- Presentamos Elastic Learned Sparse Encoder: el modelo de IA de Elastic para búsqueda semántica
- Mejorando la recuperación de información en el Elastic Stack: Presentamos Elastic Learned Sparse Encoder, nuestro nuevo modelo de recuperación
Elasticsearch proporciona una base de datos vectorial, junto con todas las herramientas que necesitas para construir la búsqueda vectorial:
- Base de datos de vectoresElasticsearch
- Casos de uso de búsqueda vectorial con Elastic
Conclusión
En esta entrada del blog, exploramos varios enfoques para recuperar información usando Elasticsearch, centrándonos específicamente en la búsqueda textual, léxica y semántica. Para demostrarlo, proporcionamos ejemplos en Python que muestran diferentes escenarios de búsqueda empleando un conjunto de datos que contiene información de productos de comercio electrónico.
Revisamos la búsqueda léxica tradicional con BM25 y discutimos sus beneficios y desafíos, como la descoordinación del vocabulario. Destacamos la importancia de incorporar el conocimiento semántico para superar este problema. Además, hablamos sobre la búsqueda vectorial densa, que permite la búsqueda semántica, y abordamos los retos asociados a este método de recuperación, incluyendo el costo computacional al indexar vectores de alta dimensión.
Por otro lado, mencionamos que los vectores dispersos comprimen excepcionalmente bien. Por ello, hablamos del Learned Sparse Encoder de Elastic, que amplía las consultas de búsqueda para incluir términos relevantes que no estaban presentes en la consulta original.
No existe una solución única para todos en cuanto a búsqueda. Cada método de recuperación tiene sus fortalezas y desafíos. Por ello, también discutimos el concepto de búsqueda híbrida.
Como puedes ver, con Elasticsearch puedes tener lo mejor de ambos mundos: ¡búsqueda léxica tradicional y búsqueda vectorial!
¿Listo para empezar? Consulta el cuaderno Python disponible y comienza una prueba gratis de Elastic Cloud.




