Búsqueda híbrida: Resultados combinados de texto completo y ELSER

Al igual que con la búsqueda vectorial en la sección anterior, en esta sección aprenderás a combinar los mejores resultados de búsqueda de consultas en texto completo y semánticas usando el algoritmo Reciprocal Rank Fusion .

Introducción a las subbúsquedas

La solución para implementar una búsqueda híbrida de texto completo y búsqueda vectorial densa fue enviar una solicitud de búsqueda que incluyera el query, knn argumentos para aplicar las dos búsquedas y el argumento rrf para combinarlas en una sola lista de resultados.

La complicación que se presenta al intentar hacer lo mismo para combinar solicitudes de búsqueda vectorial en texto completo y escasas es que ambas emplean el argumento query . Para poder proporcionar las dos consultas que deben combinar con el algoritmo RRF, es necesario incluir dos argumentos de query , y la solución para hacerlo es hacerlo con Sub-Búsquedas.

Las subbúsquedas son una función que actualmente está en vista previa técnica. Por esta razón, el cliente Elasticsearch en Python no lo soporta de forma nativa. Para sortear esta limitación, el método search() de la clase Search puede cambiar para enviar la solicitud de búsqueda usando el argumento body . A continuación puedes ver una implementación nueva, pero similar, que emplea el argumento body del cliente para enviar una solicitud de búsqueda:

Esta implementación no requiere cambios en la aplicación, ya que es funcionalmente equivalente. La única diferencia es que el método search() valida todos los argumentos antes de enviar la solicitud, siendo body la única excepción. El servidor siempre valida las solicitudes independientemente de cómo las envíe el cliente.

Con esta versión, el argumento sub_searches puede usar en Search.search() para enviar múltiples consultas de búsqueda de la siguiente manera:

Implementación de búsqueda híbrida

Para completar esta sección, recuperemos la lógica de texto completo y combinémosla con la consulta de búsqueda semántica presentada anteriormente en este capítulo.

A continuación puedes ver el endpoint actualizado de handle_search() :

Como recordarás, la función extract_filters() buscaba los filtros de categoría introducidos por el usuario en la indicación de búsqueda y devolvía la parte restante como parsed_query. Si parsed_query está vacío, significa que el usuario solo introduce un filtro de categoría, y en ese caso la consulta debe ser una match_all simple con la categoría seleccionada como filtro. Esto se implementa en la else parte del gran condicional.

Cuando hay una consulta de búsqueda, se emplea la opción sub_searches , como se muestra en la sección anterior, para incluir las consultas multi_match y text_expansion , y la opción rank aplicar que los resultados de las dos subbúsquedas se combinen en una única lista de resultados clasificados. Para completar la consulta, se proporcionan el argumento size y from_ para mantener el soporte para la paginación.

Haz clic aquí para revisar esta versión de la solicitud.

¿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