Qu'est-ce qu'un index Elasticsearch ?

info-retrieval-blog-720x420-v2.jpeg

Le mot index est relativement surchargé dans le secteur des technologies. Si vous demandez à la plupart des développeurs ce qu'est un index, ils pourraient vous répondre que ce mot se réfère habituellement à une structure de données dans une base relationnelle (SGBDR) liée à un tableau améliorant la vitesse des opérations de récupération des informations.

Qu'est-ce qu'un index Elasticsearch® exactement ? Un index Elasticsearch est un espace de nom logique où est enregistré un ensemble de documents, dont chacun regroupe des champs, composés de paires clé-valeur qui contiennent vos données.

En quoi un index Elasticsearch diffère-t-il d'une base de données relationnelle ?

Les index Elasticsearch ne sont pas les mêmes que ceux contenus dans une base de données relationnelle. Un cluster Elasticsearch doit être considéré comme une base de données regroupant de nombreux index que vous pouvez envisager comme un tableau. En outre, chaque index contient de nombreux documents.   

  • SGBDR => Bases de données => Tableaux => Colonnes/lignes
  • Elasticsearch => Clusters => Index => Partitions => Documents avec paires clé-valeur

Même si Elasticsearch stocke des documents JSON, les informations saisies dans les index sont incroyablement flexibles. Ce processus est rapide à configurer et à exécuter grâce à la multitude des intégrations et des agents Beats disponibles. Si vous souhaitez aller plus loin, vous pouvez définir vos propres processus ETL grâce à des pipelines d'ingestion ou à Logstash®, en vous fondant sur leurs nombreux processeurs et plug-ins.

Autre évolution par rapport aux bases de données relationnelles, vous pouvez importer des informations sans aucun schéma prédéfini. Les types dynamiques constituent une excellente méthode pour vous lancer rapidement ou pour prendre en compte les champs inattendus dans les documents. Une fois que vous avez tout configuré, vous pouvez passer à un schéma fixe en vue d'améliorer les performances. 

Les champs d'exécution représentent une autre fonctionnalité intéressante qui vous permet d'exécuter des schémas de lecture ou d'écriture. Ils peuvent être ajoutés à un document existant et utilisés pour obtenir un nouveau champ. Vous pouvez également créer un champ d'exécution au moment de la requête. Il s'agit de valeurs calculées fondées sur un script qui peuvent lire la source du document.

Voulez-vous voir concrètement comment cela fonctionne ? Ouvrez dès aujourd'hui un compte d'essai gratuit sur Elastic Cloud pour faire vos expérimentations.

L'interaction des données avec l'API conviviale d'Elasticsearch

Elasticsearch fournit une API RESTful utilisant le format JSON pour l'interaction avec les données des documents. Vous pouvez indexer, rechercher, mettre à jour et supprimer des documents en envoyant des requêtes HTTP aux points de terminaison appropriés du cluster. Ces opérations similaires aux actions de création, de lecture, de mise à jour et de suppression peuvent s'effectuer dans chaque document ou au sein de l'index. Vous pouvez aussi utiliser des bibliothèques de clients spécifiques au langage au lieu de l'API REST directement.
L'exemple suivant crée un document dans un index appelé playwrights avec un document_id attribué de 1. Il convient de noter que nous n'avons pas besoin de créer de schéma ni de configuration en amont. Nous insérons simplement nos données.

POST /playwrights/_doc/1
{
  "firstname": "William",
  "lastname": "Shakespeare"
}

Nous pouvons également ajouter des documents et des champs à notre convenance, ce qui est impossible à faire facilement dans une base de données relationnelle.

POST /playwrights/_doc/2
{
  "firstname": "Samuel",
  "lastname": "Beckett",
  "year_of_birth": 1906
}

Désormais, nous pouvons lancer des requêtes dans l'ensemble des documents grâce au point de terminaison de recherche.

GET /playwrights/_search
{
    "query": {
        "match_all": {}
    }
}

Vous pouvez également mener une requête pour une année de naissance précise.

GET /playwrights/_search
{
    "query": {
        “match": {
            “year_of_birth": 1906
        }
    }
}

Outre ces requêtes basiques, Elasticsearch fournit des fonctionnalités de recherche avancées, comme la mise en correspondance des approximations, la racinisation, le score de pertinence, la mise en surbrillance et la conversion en tokens qui décompose les textes en plus petits éléments, appelés les tokens. Dans la plupart des cas, ces tokens sont des mots, même s'il existe un éventail de générateurs de tokens disponibles.

Pourquoi les données dénormalisées sont-elles essentielles à une récupération plus rapide des informations ?

Dans les bases de données relationnelles, la normalisation est souvent appliquée pour éliminer la redondance des données et garantir la cohérence des informations. Par exemple, vous pourriez disposer de tableaux distincts pour votre clientèle, vos produits et vos commandes. 

Dans Elasticsearch, la dénormalisation est une pratique courante. Au lieu de répartir les données dans plusieurs tableaux, stockez toutes les informations pertinentes dans un seul document JSON. Un document de commande devrait contenir des informations sur le client et sur le produit concernés au lieu de clés étrangères se rapportant à des index distincts dédiés au produit et au client. Ainsi, il est plus facile et efficace de récupérer des données dans Elasticsearch lors des opérations de recherche. En règle générale, le coût du stockage peut être moins élevé que les frais de calcul relatifs à l'obtention de données.

Comment Elasticsearch garantit-elle la scalabilité dans les systèmes distribués ?

Chaque index est doté d'un nom unique et divisé en une ou plusieurs partitions. Ces sous-ensembles plus petits de l'index vous permettent de mettre en place un traitement parallèle et un stockage distribué dans un cluster de nœuds Elasticsearch.  Les partitions sont composées d'une partition principale et d'une réplique. Les répliques fournissent des copies redondantes de vos données afin de vous protéger de toute défaillance matérielle et d'augmenter votre capacité à gérer les requêtes de lecture, comme la recherche ou la récupération d'un document.

Lorsque vous ajoutez davantage de nœuds dans un cluster, vous disposez d'une capacité d'indexation et de recherche supplémentaire, ce qui n'est pas si facile à obtenir avec une base de données relationnelle.

Si nous reprenons notre exemple ci-dessus avec playwrights, si nous exécutons la commande suivante, nous obtenons les mappings types automatiquement déterminés par Elasticsearch, mais aussi le nombre de partitions et de répliques attribuées par l'index.

GET /fr/playwrights/

Quels types de données peuvent être indexés dans Elasticsearch ?

Elasticsearch peut indexer de nombreux types de données, principalement du texte, mais aussi des informations numériques et liées à la géolocalisation. La solution peut également stocker des vecteurs denses utilisés dans les recherches de similarités. Passons-les en revue un par un.

Index inversés pour les recherches textuelles/lexicales

Elasticsearch déterminera également la meilleure structure de données sous-jacente à utiliser pour un type de champ particulier. Par exemple, des tokens pourraient avoir été générés pour le texte, puis stockés dans un index inversé. Cette structure répertorie chaque token unique apparaissant dans tout document et identifie l'ensemble des documents contenant chaque mot.

Le tableau ci-dessous illustre la composition générale d'un index inversé. Nous constatons que, si nous cherchons le mot "Londres", il apparaît dans six documents différents au sein de l'index. Cet index inversé nous permet de lancer très rapidement des requêtes textuelles.

Token

Identifiant des documents

Londres

1,3,8,12,23,88

Paris

1,12,88

Madrid3,8,12
Berlin12,23

Fonctionnalités de recherche de données numériques et liées à la géolocalisation pour une analyse spatiale efficace

Les données numériques et de géolocalisation devraient être stockées dans des arborescences BKD, également appelées "index Block KD-Tree". Cette structure de données est utilisée dans les applications d'ingénierie pour garantir des requêtes et une indexation spatiales efficaces des informations multidimensionnelles. Elle organise les points de données en blocs, ce qui accélère les recherches de plage et les requêtes du plus proche voisin dans de grands ensembles de données. Il s'agit donc d'un outil précieux pour les ingénieurs chargés de l'optimisation et de l'analyse des données spatiales.

Recherche vectorielle/sémantique avec le traitement du langage naturel

Vous avez peut-être entendu parler de la recherche vectorielle. De quoi s'agit-il exactement ? Les moteurs de recherche vectorielle, qu'on appelle aussi recherche dans des bases de données vectorielles, recherche sémantique ou recherche cosinus, identifient les plus proches voisins d'une requête (vectorisée) donnée. La puissance de la recherche vectorielle réside dans sa capacité à identifier des documents similaires qui ne sont pas des correspondances textuelles exactes, tel que l'index inversé de notre exemple ci-dessus le nécessiterait. Au contraire, elle se fonde sur des vecteurs qui décrivent un certain niveau de similitude. 

Les spécialistes du traitement automatique du langage naturel ont développé une méthode appelée plongement textuel qui permet d'encoder les mots et les phrases en tant que vecteurs numériques. Ces représentations vectorielles sont conçues pour capturer le contenu linguistique du texte et peuvent servir à évaluer la similarité existant entre une requête et un document.

Voici une liste des cas d'utilisation courants pour la recherche vectorielle : 

  • répondre aux questions ;
  • trouver les réponses aux questions déjà posées, si elles sont similaires, mais pas identiques dans un format textuel ; 
  • formuler des recommandations, par exemple, une application de musique qui identifie des chansons similaires à vos préférences.  

L'ensemble de ces cas d'utilisation exploitent des vecteurs dotés de dizaines de milliers de dimensions, ce qui fournit  une représentation exhaustive des données à des fins de recommandations ciblées et d'évaluation de la similarité avec précision. 

Elasticsearch prend en charge la recherche vectorielle grâce au type de document dense_vector et à sa capacité à exécuter des recherches de similarité entre le vecteur dans le document et le terme de recherche après sa conversion en vecteur. 

Pour les personnes souhaitant explorer un peu plus la question de l'intelligence artificielle générative, nous mettons également à votre disposition ESRE, ou Elasticsearch Relevance Engine™, qui est spécialement conçu pour propulser les applications de recherche basées sur l'intelligence artificielle. ESRE donne aux développeurs une suite complète d'algorithmes de récupération sophistiqués et la capacité à intégrer de grands modèles de langage.

À vous de jouer !

Comme vous pouvez le constater, les index Elasticsearch ont beaucoup progressé depuis que Shay Banon, cofondateur et directeur technologique d'Elastic, a conçu un moteur de recherche de recettes pour sa femme. Pour poursuivre votre exploration, nous vous conseillons de créer un compte d'essai sur Elastic Cloud. Cela ne vous prendra que quelques minutes et vous pourrez vous lancer directement. En outre, nous vous invitons à regarder le webinar Prise en main d'Elasticsearch.

Date de publication d'origine : 24 février 2013 ; date de mise à jour : 17 juillet 2023.