Passez à la pratique avec Elasticsearch : explorez nos notebooks d’exemples, lancez un essai gratuit sur le cloud ou testez Elastic dès maintenant sur votre machine locale.
Construire un logiciel dans n'importe quel langage de programmation, y compris Go, c'est s'engager dans une vie d'apprentissage. Tout au long de sa carrière universitaire et professionnelle, Carly a dû s'adapter au fait d'être polyglotte et de toucher à de nombreux langages de programmation, notamment Python, C, JavaScript, TypeScript et Java. Mais ce n'était pas suffisant ! Récemment, elle a commencé à jouer avec Go !
Tout comme les animaux, les langages de programmation et l'un de vos sympathiques auteurs, la recherche a connu une évolution des différentes pratiques qu'il peut être difficile de choisir pour votre propre cas d'utilisation de la recherche. Dans ce blog, nous présenterons une vue d'ensemble de la recherche traditionnelle par mot-clé ainsi qu'un exemple utilisant Elasticsearch et le client Elasticsearch Go.
Produits requis
Pour suivre cet exemple, assurez-vous que les conditions préalables suivantes sont remplies :
- 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, peuplé d'un ensemble de pages sur les rongeurs, y compris notre sympathique Gopher, tiré de Wikipedia :

Connexion à Elasticsearch
Dans nos exemples, nous utiliserons l'API typée offerte 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 indiqué plus loin.
Recherche par mot-clé
La recherche par mot-clé est le type de recherche fondamental que nous connaissons depuis la création d'Archie, le premier moteur de recherche Internet documenté écrit en 1990.
La traduction des documents en un index inversé est un élément central de la recherche par mots-clés. Exactement comme l'index que l'on trouve à la fin d'un manuel, un index inversé contient une correspondance entre une liste de mots clés et leur emplacement dans chaque document. Le diagramme ci-dessous montre les étapes clés de la création de l'indice :

Comme indiqué ci-dessus, la génération de jetons dans Elasticsearch comprend trois étapes clés :
- Suppression des caractères inutiles via zéro ou plusieurs
char_filters. Dans notre exemple, nous supprimons les éléments HTML dans le champbody_contentvia le filtrehtml_strip. - Séparation des tokens du contenu avec le
standardtokenizer, qui séparera les tokens en fonction de l'espacement et de la ponctuation clé. - Suppression des tokens indésirables ou transformation des tokens du flux de sortie du tokenizer à l'aide de zéro ou plusieurs
filteroptions, telles que lelowercasefiltre de tokens ou des stemmers tels que lesnowballstemmer pour transformer les tokens en leur racine linguistique.
Rechercher dans Elasticsearch avec Go
Lors d'une requête avec le client Go, nous spécifions l'index que nous voulons rechercher et nous transmettons la requête et d'autres options, comme dans l'exemple ci-dessous :
Dans l'exemple ci-dessus, nous effectuons une match requête standard pour trouver tout document dans notre index qui contient la chaîne de caractères spécifiée dans notre fonction. Notez que nous transmettons un nouveau contexte vide à l'exécution de la recherche via Do(context.Background()). En outre, toutes les erreurs renvoyées par Elasticsearch sont transmises à l'attribut err à des fins de journalisation et de gestion des erreurs.
Les résultats sont renvoyés sous la forme res.Hits.Hits, l'attribut _Source contenant le document lui-même au format JSON. Pour convertir cette source en une structure compatible avec Go, nous devons décompresser la réponse JSON à l'aide du paquetage Go encoding/json, comme le montre l'exemple ci-dessous :
La recherche et l'annulation de la requête gopher renverront la page Wikipédia de Gopher comme prévu :
Cependant, si nous demandons à What do Gophers eat?, nous n'obtenons pas tout à fait les résultats escomptés :
Une simple recherche par mot-clé permet de renvoyer les résultats à votre application Go d'une manière performante qui fonctionne d'une manière qui nous est familière dans les applications que nous utilisons. Elle fonctionne également très bien pour les correspondances de termes exacts qui sont pertinentes dans des scénarios tels que la recherche d'une entreprise ou d'un terme particulier.
Cependant, comme nous l'avons vu plus haut, il peine à identifier le contexte et la sémantique en raison du problème d'inadéquation du vocabulaire. En outre, la prise en charge des formats de fichiers non textuels, tels que les images et les fichiers audio, constitue un défi.
Conclusion
Nous avons vu ici comment effectuer des requêtes textuelles traditionnelles dans Elasticsearch en utilisant le client Elasticsearch Go. Go étant largement utilisé pour les scripts d'infrastructure et la construction de serveurs web, il est utile de savoir comment effectuer des recherches en Go.
Consultez le repo GitHub pour tout le code de cette série. Suivez la partie 2 pour avoir une vue d'ensemble de la recherche vectorielle et savoir comment effectuer une recherche vectorielle dans Go. D'ici là, bonne chasse aux marmottes !
