Usar búsqueda híbrida para la detección de errores con Elasticsearch y Go

Aprende cómo lograr búsqueda híbrida combinando búsqueda por palabras clave y vectorial usando Elasticsearch y el cliente Elasticsearch Go.

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.

En las partes anteriores de este serial, se demostró cómo usar el cliente Elasticsearch Go para la búsqueda tradicional por palabras clave y la búsqueda vectorial. Esta tercera parte trata sobre la búsqueda híbrida. Compartiremos ejemplos de cómo puedes combinar tanto búsqueda vectorial como búsqueda por palabras clave usando Elasticsearch y el cliente Elasticsearch Go.

Prerrequisitos

Al igual que en la primera parte de este serial, se requieren los siguientes requisitos previos para este ejemplo:

  1. Instalación de Go versión 1.21 o posterior
  2. Crea tu propio repositorio de Go usando la estructura recomendada y la gestión de paquetes que se menciona en la documentación de Go
  3. Creando tu propio clúster de Elasticsearch, poblado con un conjunto de páginas basadas en roedores, incluyendo nuestro amigable Gopher, de Wikipedia:

Conexión con Elasticsearch

Como recordatorio, en nuestros ejemplos emplearemos la API tipada que ofrece el cliente Go. Establecer una conexión segura para cualquier consulta requiere configurar al cliente usando cualquiera de:

  1. ID de la nube y clave API si se emplea Elastic Cloud
  2. URL del clúster, nombre de usuario, contraseña y el certificado

Conectarse a nuestro clúster ubicado en Elastic Cloud sería así:

La conexión client puede entonces emplear para búsqueda, como se demuestra en las secciones posteriores.

Al combinar cualquier conjunto de algoritmos de búsqueda, el enfoque tradicional fue configurar manualmente las constantes para potenciar cada tipo de consulta. Específicamente, se especifica un factor para cada consulta, y el conjunto de resultados combinados se compara con el conjunto esperado para determinar la recuperación de la consulta. Luego repetimos para varios conjuntos de factores y elegimos el que esté más cerca de nuestro estado deseado.

Por ejemplo, combinar una consulta de búsqueda de texto individual potenciada por un factor de 0.8 con una consulta knn de menor factor de 0.2 puede hacer especificando el campo Boost en ambos tipos de consulta, como se muestra en el siguiente ejemplo:

El factor especificado en la opción de Boost para cada consulta se suma al puntaje del documento. Al aumentar el puntaje de nuestra consulta de coincidencia en un factor mayor que la consulta knn, los resultados de la consulta por palabra clave tienen un peso más fuerte.

El reto del aumento manual, especialmente si no eres un experto en búsquedas, es que requiere ajuste para identificar los factores que manejarán al conjunto de resultados deseado. Simplemente se trata de probar valores aleatorios para ver qué te acerca más al conjunto de resultados deseado.

Fusión de rangos recíprocos en un cliente híbrido de búsqueda y Go

Reciprocal Rank Fusion, o RRF, se publicó en formato de vista previa técnica para búsqueda híbrida en Elasticsearch 8.9. Su objetivo es reducir la curva de aprendizaje asociada al ajuste y disminuir el tiempo dedicado a experimentar con factores para optimizar el conjunto de resultados.

Con RRF, el puntaje del documento se recalcula mezclando los puntajes mediante el siguiente algoritmo:

El beneficio de usar RRF es que podemos aprovechar los valores predeterminados sensatos dentro de Elasticsearch. La constante de clasificación k por defecto es 60. Para proporcionar un equilibrio entre la relevancia de los documentos devueltos y el rendimiento de la consulta al buscar sobre grandes conjuntos de datos, el tamaño del conjunto de resultados para cada consulta considerada se limita al valor de window_size, que por defecto es 100 según se indica en la documentación.

k y windows_size también pueden configurar dentro de la configuración Rrf dentro del método Rank en el cliente Go, como se muestra en el siguiente ejemplo:

Conclusión

Aquí hablamos de cómo combinar la búsqueda vectorial y la búsqueda por palabras clave en Elasticsearch usando el cliente Elasticsearch Go.

Echa un vistazo al repositorio de GitHub para ver todo el código de este serial. Si no lo hiciste ya, echa un vistazo a la parte 1 y la parte 2 para ver todo el código de este serial.

¡Feliz caza de topos!

Recursos

  1. Guía Elasticsearch
  2. Cliente Elasticsearch Go
  3. ¿Qué es la búsqueda vectorial? | Elástico
  4. Fusión recíproca de rangos

Contenido relacionado

¿Estás listo para crear experiencias de búsqueda de última generación?

No se logra una búsqueda suficientemente avanzada con los esfuerzos de uno. Elasticsearch está impulsado por científicos de datos, operaciones de ML, ingenieros y muchos más que son tan apasionados por la búsqueda como tú. Conectemos y trabajemos juntos para crear la experiencia mágica de búsqueda que te dará los resultados que deseas.

Pruébalo tú mismo