Utiliser la recherche hybride pour la chasse aux gophers avec Elasticsearch et Go

Apprenez à réaliser une recherche hybride en combinant la recherche par mot-clé et la recherche vectorielle à l'aide d'Elasticsearch et du client Elasticsearch Go.

De la recherche vectorielle aux puissantes API REST, Elasticsearch offre aux développeurs la boîte à outils de recherche la plus complète. Explorez nos notebooks d’exemples sur GitHub pour tester de nouveaux cas d’usage. Vous pouvez également démarrer votre essai gratuit ou exécuter Elasticsearch en local dès aujourd’hui.

Dans les parties précédentes de cette série, il a été démontré comment utiliser le client Elasticsearch Go pour la recherche traditionnelle par mot-clé et la recherche vectorielle. Cette troisième partie traite de la recherche hybride. Nous partagerons des exemples de la façon dont vous pouvez combiner la recherche vectorielle et la recherche par mot-clé en utilisant Elasticsearch et le client Elasticsearch Go.

Produits requis

Tout comme dans la première partie de cette série, les conditions suivantes sont requises pour cet exemple :

  1. Installation de Go version 1.21 ou ultérieure
  2. Créez votre propre répertoire Go en utilisant la structure recommandée et la gestion des paquets décrite dans la documentation Go.
  3. Création de votre propre cluster Elasticsearch, alimenté par un ensemble de pages sur les rongeurs, y compris notre sympathique Gopher, tiré de Wikipédia :

Connexion à Elasticsearch

Pour rappel, dans nos exemples, nous utiliserons l'API typée proposée par le client Go. Pour établir une connexion sécurisée pour n'importe quelle requête, il faut configurer le client en utilisant l'une ou l'autre des méthodes suivantes :

  1. ID du nuage et clé API si vous utilisez Elastic Cloud
  2. URL du cluster, nom d'utilisateur, mot de passe et certificat

La connexion à notre cluster situé sur Elastic Cloud ressemblerait à ceci :

La connexion client peut alors être utilisée pour la recherche, comme le montrent les sections suivantes.

Lors de la combinaison d'un ensemble d'algorithmes de recherche, l'approche traditionnelle consiste à configurer manuellement des constantes pour stimuler chaque type de requête. Plus précisément, un facteur est spécifié pour chaque requête, et l'ensemble des résultats combinés est comparé à l'ensemble prévu pour déterminer le rappel de la requête. Nous répétons ensuite l'opération pour plusieurs ensembles de facteurs et choisissons celui qui se rapproche le plus de l'état souhaité.

Par exemple, la combinaison d'une requête de recherche textuelle unique augmentée d'un facteur de 0.8 avec une requête knn avec un facteur inférieur de 0.2 peut être réalisée en spécifiant le champ Boost dans les deux types de requêtes, comme le montre l'exemple ci-dessous :

Le facteur spécifié dans l'option Boost pour chaque requête est ajouté au score du document. En augmentant le score de notre requête par un facteur plus important que celui de la requête knn, les résultats de la requête par mot-clé sont plus fortement pondérés.

La difficulté du renforcement manuel, en particulier si vous n'êtes pas un expert en recherche, réside dans le fait qu'il nécessite une mise au point pour déterminer les facteurs qui conduiront à l'ensemble de résultats souhaité. Il s'agit simplement d'essayer des valeurs aléatoires pour voir ce qui vous rapproche de l'ensemble des résultats souhaités.

Fusion de rangs réciproques dans la recherche hybride & Go client

Reciprocal Rank Fusion, ou RRF, a été publié en avant-première technique pour la recherche hybride dans Elasticsearch 8.9. Il vise à réduire la courbe d'apprentissage associée à la mise au point et à réduire le temps passé à expérimenter des facteurs pour optimiser l'ensemble des résultats.

Avec la méthode RRF, le score du document est recalculé en combinant les scores par l'algorithme ci-dessous :

L'avantage de l'utilisation de RRF est que nous pouvons utiliser les valeurs par défaut d'Elasticsearch. La constante de classement k est remplacée par défaut par 60. Afin de trouver un compromis entre la pertinence des documents renvoyés et les performances de la requête lors de la recherche sur de grands ensembles de données, la taille de l'ensemble de résultats pour chaque requête considérée est limitée à la valeur de window_size, qui est fixée par défaut à 100 comme indiqué dans la documentation.

k et windows_size peuvent également être configurés dans la configuration Rrf dans la méthode Rank dans le client Go, comme dans l'exemple ci-dessous :

Conclusion

Nous avons vu ici comment combiner la recherche vectorielle et la recherche par mot-clé dans Elasticsearch à l'aide du client Elasticsearch Go.

Consultez le repo GitHub pour tout le code de cette série. Si vous ne l'avez pas encore fait, consultez les parties 1 et 2 pour connaître tous les codes de cette série.

Bonne chasse aux marmottes !

Ressources

  1. Guide Elasticsearch
  2. Client Elasticsearch Go
  3. Qu'est-ce que la recherche vectorielle ? | Elastique
  4. Fusion de rangs réciproques

Pour aller plus loin

Prêt à créer des expériences de recherche d'exception ?

Une recherche suffisamment avancée ne se fait pas avec les efforts d'une seule personne. Elasticsearch est alimenté par des data scientists, des ML ops, des ingénieurs et bien d'autres qui sont tout aussi passionnés par la recherche que vous. Mettons-nous en relation et travaillons ensemble pour construire l'expérience de recherche magique qui vous permettra d'obtenir les résultats que vous souhaitez.

Jugez-en par vous-même