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 :
- Installation de Go version 1.21 ou ultérieure
- Créez votre propre répertoire Go en utilisant la structure recommandée et la gestion des paquets décrite dans la documentation Go.
- 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 :
- ID du nuage et clé API si vous utilisez Elastic Cloud
- 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.
Renforcement manuel pour la recherche hybride
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 !




