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.
La recherche est le processus de localisation des informations les plus pertinentes sur la base de votre requête de recherche ou de requêtes combinées, et les résultats de recherche pertinents sont les documents qui correspondent le mieux à ces requêtes. Bien qu'il existe plusieurs défis et méthodes associés à la recherche, l'objectif final reste le même : trouver la meilleure réponse possible à votre question.
Compte tenu de cet objectif, dans cet article de blog, nous allons explorer différentes approches de la recherche d'informations à l'aide d'Elasticsearch, en nous concentrant plus particulièrement sur la recherche de texte : recherche lexicale et sémantique.
Produits requis
Pour ce faire, nous fournirons des exemples Python qui démontrent divers scénarios de recherche sur un ensemble de données généré pour simuler des informations sur des produits de commerce électronique.
Cet ensemble de données contient plus de 2 500 produits, chacun accompagné d'une description. Ces produits sont classés en 76 catégories de produits distinctes, chaque catégorie contenant un nombre variable de produits, comme indiqué ci-dessous :

Visualisation du treemap - les 22 premières valeurs de category.keyword (catégories de produits)
Pour l'installation, vous aurez besoin de
- Python 3.6 ou version ultérieure
- Le client Elastic Python
- Déploiement d'Elastic 8.8 ou d'une version ultérieure, avec un nœud d'apprentissage automatique de 8 Go de mémoire
- Le modèle Elastic Learned Sparse EncodeR qui est préchargé dans Elastic a été installé et démarré sur votre déploiement.
Nous utiliserons Elastic Cloud, une version d'essai gratuite est disponible.
Outre les requêtes de recherche présentées dans cet article de blog, un carnet Python vous guidera dans les processus suivants :
- Établir une connexion à notre déploiement Elastic en utilisant le client Python
- Charger un modèle d'intégration de texte dans le cluster Elasticsearch
- Créer un index avec des correspondances pour indexer les vecteurs de caractéristiques et les vecteurs denses.
- Créer un pipeline d'ingestion avec des processeurs d'inférence pour l'intégration et l'expansion du texte

Recherche lexicale - recherche éparse
La manière classique dont les documents sont classés en fonction de leur pertinence par Elasticsearch sur la base d'une requête textuelle utilise l'implémentation Lucene du modèle BM25, un modèle clairsemé pour la recherche lexicale. Cette méthode suit l'approche traditionnelle de la recherche de texte, en recherchant des correspondances de termes exacts.
Pour rendre cette recherche possible, Elasticsearch convertit les données des champs de texte en un format de recherche en effectuant une analyse de texte.
L'analyse de texte est effectuée par un analyseur, un ensemble de règles régissant le processus d'extraction des mots-clés pertinents pour la recherche. Un analyseur doit avoir exactement un tokenizer. Le tokenizer reçoit un flux de caractères et le décompose en tokens individuels (généralement des mots individuels), comme dans l'exemple ci-dessous :
Balisage des chaînes de caractères pour la recherche lexicale
Sortie
Dans cet exemple, nous utilisons l'analyseur par défaut, l'analyseur standard, qui fonctionne bien pour la plupart des cas d'utilisation car il fournit une tokenisation basée sur la grammaire anglaise. La tokenisation permet de faire correspondre des termes individuels, mais chaque token est toujours mis en correspondance de manière littérale.
Si vous souhaitez personnaliser votre expérience de recherche, vous pouvez choisir un autre analyseur intégré. Par exemple, en mettant à jour le code pour utiliser l'analyseur de mots v ides, il décomposera le texte en jetons à partir de tout caractère autre qu'une lettre, avec la possibilité de supprimer les mots vides.
Sortie
Lorsque les analyseurs intégrés ne répondent pas à vos besoins, vous pouvez créer un analyseur personnalisé, qui utilise la combinaison appropriée de zéro ou plusieurs filtres de caractères, un tokenizer et zéro ou plusieurs filtres de jetons.
Dans l'exemple ci-dessus, qui combine un tokenizer et des filtres de jetons, le texte sera mis en minuscules par le filtre de minuscules avant d'être traité par le filtre de jetons de synonymes.
Correspondance lexicale
BM25 mesurera la pertinence des documents par rapport à une requête de recherche donnée sur la base de la fréquence des termes et de leur importance.
Le code ci-dessous effectue une recherche de correspondance, recherchant jusqu'à deux documents en tenant compte des valeurs du champ "description" de l'index "ecommerce-search" et de la requête de recherche. "Meubles confortables pour un grand balcon".
L'affinement des critères pour qu'un document soit considéré comme correspondant à cette requête peut améliorer la précision. Cependant, les résultats plus spécifiques sont assortis d'une plus faible tolérance aux variations.
Sortie
En analysant le résultat, le résultat le plus pertinent est le produit "Barbie Dreamhouse", dans la catégorie "Toys", et sa description est très pertinente car elle inclut les termes "furniture", "large" et "balcony", c'est le seul produit avec 3 termes dans la description qui correspondent à la requête de recherche, le produit est également le seul avec le terme "balcony" dans la description.
Le deuxième produit le plus pertinent est un "Comfortable Rocking Chair" catégorisé en "Indoor Furniture" et sa description inclut les termes "comfortable" et "furniture". Seuls 3 produits dans l'ensemble de données correspondent à au moins 2 termes de cette requête de recherche, et ce produit est l'un d'entre eux.
"Comfortable" apparaît dans la description de 105 produits et "furniture" dans la description de 4 produits avec 4 catégories différentes : Jouets, Mobilier d'intérieur, Mobilier d'extérieur et 'Dog and Cat Supplies & Toys'.
Comme vous pouvez le constater, le produit le plus pertinent par rapport à la requête est un jouet et le deuxième produit le plus pertinent est un meuble d'intérieur. Si vous souhaitez obtenir des informations détaillées sur le calcul du score afin de savoir pourquoi ces documents correspondent, vous pouvez attribuer la valeur true au paramètre explain __query.
Bien que les deux résultats soient les plus pertinents, compte tenu à la fois du nombre de documents et de l'occurrence des termes dans cet ensemble de données, l'intention derrière la requête "Meubles confortables pour un grandbalcon" est de rechercher des meubles pour un grand balcon réel, à l'exclusion, entre autres, des jouets et des meubles d'intérieur.
La recherche lexicale est relativement simple et rapide, mais elle présente des limites car il n'est pas toujours possible de connaître tous les termes et synonymes possibles sans nécessairement connaître l'intention et les requêtes de l'utilisateur. Un phénomène courant dans l'utilisation du langage naturel est l'inadéquation du vocabulaire. % L es recherches montrent qu'en moyenne, dans80 % des cas, des personnes différentes (experts dans le même domaine) nomment la même chose différemment.
Ces limites nous incitent à rechercher d'autres modèles de notation qui intègrent des connaissances sémantiques. Les modèles basés sur des transformateurs, qui excellent dans le traitement de jetons d'entrée séquentiels tels que le langage naturel, capturent le sens sous-jacent de votre recherche en prenant en compte les représentations mathématiques des documents et des requêtes. Cela permet une représentation vectorielle dense et contextuelle du texte, qui alimente la recherche sémantique, un moyen raffiné de trouver du contenu pertinent.
Recherche sémantique - recherche dense
Dans ce contexte, après avoir converti vos données en valeurs vectorielles significatives, l'algorithme de recherche k-nearest neighbor (kNN ) est utilisé pour trouver les représentations vectorielles dans un ensemble de données qui sont les plus similaires à un vecteur d'interrogation. Elasticsearch prend en charge deux méthodes de recherche kNN, le kNN exact par force brute et le kNN approximatif, également connu sous le nom d'ANN.
Le kNN brutal garantit des résultats précis, mais ne s'adapte pas bien aux grands ensembles de données. Le kNN approximatif trouve efficacement les voisins les plus proches approximatifs en sacrifiant une partie de la précision pour améliorer les performances.
Grâce à la prise en charge par Lucene de la recherche kNN et des index vectoriels denses, Elasticsearch tire parti de l'algorithme Hierarchical Navigable Small World (HNSW), qui démontre d'excellentes performances de recherche sur une variété d'ensembles de données de référence. Une recherche kNN approximative peut être effectuée en Python à l'aide du code d'exemple ci-dessous.
Recherche sémantique avec kNN approximatif
Ce bloc de code utilise le kNN d'Elasticsearch pour renvoyer jusqu'à deux produits dont la description est similaire à la requête vectorisée (query_vector_build) de "Meubles confortables pour un grand balcon" en tenant compte de l'intégration du champ "description" dans l'ensemble de données sur les produits.
Les encastrements de produits ont été préalablement générés dans un pipeline d'ingestion avec un processeur d'inférence contenant le logiciel "all-mpnet-base-v2" pour déduire les données qui étaient ingérées dans le pipeline.
Ce modèle a été choisi sur la base de l'évaluation des modèles pré-entraînés à l'aide de "sentence_transformers.evaluation" où différentes classes sont utilisées pour évaluer un modèle pendant la formation. Le modèle "all-mpnet-base-v2" a démontré la meilleure performance moyenne selon le classement Sentence-Transformers et a également obtenu une position favorable sur le Massive Text Embedding Benchmark (MTEB) Leaderboard. Le modèle pré-entraîné microsoft/mpnet-base et affiné sur un ensemble de données de 1B paires de phrases, il cartographie les phrases dans un espace vectoriel dense de 768 dimensions.
Par ailleurs, il existe de nombreux autres modèles qui peuvent être utilisés, en particulier ceux qui sont adaptés aux données spécifiques à votre domaine.
Sortie
Le résultat peut varier en fonction du modèle choisi, des filtres et de la syntonisation approximative de kNN.
Les résultats de la recherche kNN se trouvent tous deux dans la catégorie "Outdoor Furniture", même si le mot "outdoor" n'a pas été explicitement mentionné dans la requête, ce qui souligne l'importance de la compréhension sémantique dans le contexte.
La recherche vectorielle dense offre plusieurs avantages :
- Permettre la recherche sémantique
- Évolutivité pour traiter de très grands ensembles de données
- Flexibilité pour traiter un large éventail de types de données
Cependant, la recherche vectorielle dense présente également ses propres difficultés :
- Choisir le bon modèle d'intégration pour votre cas d'utilisation
- Une fois le modèle choisi, il peut être nécessaire de l'affiner pour optimiser les performances sur un ensemble de données spécifiques au domaine, un processus qui nécessite la participation d'experts du domaine.
- En outre, l'indexation de vecteurs à haute dimension peut être très coûteuse sur le plan informatique
Recherche sémantique - récupération de données éparses apprises
Explorons une autre approche : la récupération éparse apprise, une autre façon d'effectuer une recherche sémantique.
En tant que modèle clairsemé, il utilise l'index inversé basé sur Lucene d'Elasticsearch, qui bénéficie de décennies d'optimisations. Toutefois, cette approche va au-delà du simple ajout de synonymes avec des fonctions de notation lexicale telles que BM25. Au lieu de cela, il incorpore des associations apprises en utilisant une connaissance plus approfondie de la langue pour optimiser la pertinence.
En élargissant les requêtes de recherche pour inclure des termes pertinents qui ne sont pas présents dans la requête originale, l' encodeur de vecteurs épar s Elastic Learned Sparse Encoder améliore les encastrements de vecteurs épars, comme vous pouvez le voir dans l'exemple ci-dessous.
Recherche de vecteurs épars à l'aide d'un codeur épars à apprentissage élastique
Sortie
Les résultats dans ce cas incluent la catégorie "Garden Furniture", qui offre des produits assez similaires à "Outdoor Furniture".
En analysant "ml.tokens", le champ "rank_features" contenant les tokens générés par Learned Sparse Retrieval, il devient évident que parmi les différents tokens générés, il y a des termes qui, bien que ne faisant pas partie de la requête de recherche, sont toujours pertinents dans leur signification, tels que "relax" (confortable), "sofa" (meuble) et "outdoor" (balcon).
L'image ci-dessous présente certains de ces termes en regard de la requête, avec et sans expansion des termes.

Comme nous l'avons observé, ce modèle permet une recherche contextuelle et contribue à atténuer le problème d'inadéquation du vocabulaire tout en fournissant des résultats plus faciles à interpréter. Il peut même être plus performant que les modèles à vecteurs denses lorsqu'aucun recyclage spécifique au domaine n'est appliqué.
Recherche hybride : résultats pertinents grâce à la combinaison de la recherche lexicale et sémantique
En matière de recherche, il n'existe pas de solution universelle. Chacune de ces méthodes de recherche a ses avantages, mais aussi ses inconvénients. En fonction du cas d'utilisation, la meilleure option peut changer. Souvent, les meilleurs résultats obtenus par les différentes méthodes de recherche peuvent être complémentaires. C'est pourquoi, pour améliorer la pertinence, nous chercherons à combiner les points forts de chaque méthode.
Il existe plusieurs façons de mettre en œuvre une recherche hybride, notamment la combinaison linéaire, en attribuant un poids à chaque score, et la fusion des rangs réciproques (RRF), où il n'est pas nécessaire de spécifier un poids.
Elasticsearch : le meilleur des deux mondes avec la recherche lexicale et sémantique
Dans ce code, nous avons effectué une recherche hybride avec deux requêtes ayant la valeur " Unetable à manger et des chaises confortables pour un grand balcon". Au lieu d'utiliser "furniture" comme terme de recherche, nous spécifions ce que nous recherchons, et les deux recherches prennent en compte les mêmes valeurs de champ, "description". Le classement est déterminé par une combinaison linéaire avec un poids égal pour les notes BM25 et ELSER.
Sortie
Dans le code ci-dessous, nous utiliserons la même valeur pour la requête, mais nous combinerons les scores de BM25 (paramètre de requête) et de kNN (paramètre knn) en utilisant la méthode de fusion par rang réciproque pour combiner et classer les documents.
La fonctionnalité RRF est en avant-première technique. La syntaxe sera probablement modifiée avant l'AG.
Sortie
Ici, nous pourrions également utiliser différents champs et valeurs ; certains de ces exemples sont disponibles dans le Python notebook.
Comme vous pouvez le constater, Elasticsearch vous offre le meilleur des deux mondes : la recherche lexicale traditionnelle et la recherche vectorielle, qu'elle soit éparse ou dense, pour atteindre votre objectif et trouver la meilleure réponse possible à votre question.
Si vous souhaitez continuer à vous familiariser avec les approches mentionnées ici, ces blogs peuvent vous être utiles :
- Améliorer la recherche d'informations dans la pile élastique : Recherche hybride
- Recherche vectorielle dans Elasticsearch : La raison d'être de la conception
- Comment obtenir le meilleur de la recherche lexicale et de la recherche alimentée par l'IA avec la base de données vectorielle d'Elastic ?
- Présentation d'Elastic Learned Sparse Encoder : Le modèle d'IA d'Elastic pour la recherche sémantique
- Améliorer la recherche d'information dans la pile Elastic : Présentation d'Elastic Learned Sparse Encoder, notre nouveau modèle de recherche d'information
Elasticsearch fournit une base de données vectorielle, ainsi que tous les outils dont vous avez besoin pour construire une recherche vectorielle :
- Base de données vectorielleElasticsearch
- Cas d'utilisation de la recherche vectorielle avec Elastic
Conclusion
Dans ce billet de blog, nous avons exploré différentes approches de la recherche d'informations à l'aide d'Elasticsearch, en nous concentrant plus particulièrement sur la recherche textuelle, lexicale et sémantique. Pour le démontrer, nous avons fourni des exemples Python illustrant différents scénarios de recherche à l'aide d'un ensemble de données contenant des informations sur des produits de commerce électronique.
Nous avons passé en revue la recherche lexicale classique avec BM25 et discuté de ses avantages et de ses défis, tels que l'inadéquation du vocabulaire. Nous avons souligné l'importance d'intégrer des connaissances sémantiques pour résoudre ce problème. En outre, nous avons abordé la recherche vectorielle dense, qui permet une recherche sémantique, et les défis associés à cette méthode de recherche, notamment le coût de calcul lors de l'indexation de vecteurs à haute dimension.
D'autre part, nous avons mentionné que les vecteurs épars se compriment exceptionnellement bien. Ainsi, nous avons discuté de l'encodeur Learned Sparse Encoder d'Elastic, qui étend les requêtes de recherche pour inclure des termes pertinents qui ne sont pas présents dans la requête originale.
Il n'existe pas de solution unique en matière de recherche. Chaque méthode de recherche a ses avantages et ses inconvénients. C'est pourquoi nous avons également abordé le concept de recherche hybride.
Comme vous pouvez le constater, avec Elasticsearch, vous pouvez bénéficier du meilleur des deux mondes : la recherche lexicale traditionnelle et la recherche vectorielle !
Prêt à commencer ? Consultez le cahier Python disponible et commencez un essai gratuit d'Elastic Cloud.




