Parlons des documents et index sur Elasticsearch
Published: 2023-01-27 22:50:41

Dans cet article, nous allons explorer les premières étapes pour utiliser Elasticsearch en utilisant les documents et les index. Nous avons déjà vu comment installer Elasticsearch et Kibana sur un ordinateur local ou en utilisant des conteneurs Docker. Aujourd'hui, nous allons utiliser l'interface Dev Tools pour envoyer des requêtes à Elasticsearch. Il est recommandé de suivre les instructions de l'article tout en exécutant les requêtes pour se familiariser avec Elasticsearch.

Les **documents** sont utilisés pour stocker les données dans Elasticsearch. Un document est un objet JSON avec une clé et une valeur, par exemple: `{ "name": "Jane Doe", "gender": "femme" }`. Pour envoyer un document à Elasticsearch, nous pouvons utiliser les API REST. Pour enregistrer un document, nous utilisons la méthode PUT, spécifions l'index où les données seront stockées, et donnons un id au document. Par exemple, pour ajouter un document à l'index "voitures" avec l'id "1", la requête serait: `PUT voitures/_doc/1 { "marque": "Toyota", "propriétaire": "Gavi", "couleur": "grise" }`.

Elasticsearch nous indique que le document a été ajouté à l'index spécifié avec une version 1. Si nous relançons la même requête en modifiant la marque de la voiture, Elasticsearch nous indique que l'opération était une mise à jour et la version est passée à 2. Pour récupérer un document, nous utilisons la méthode GET, spécifions l'index, _**_doc**_ pour indiquer qu'il s'agit d'un document, et enfin l'id du document. Par exemple, pour récupérer le document avec l'id "1" de l'index "voitures", la requête serait: `GET voitures/_doc/1`.

Avant de vous montrer comment utiliser Elasticsearch, voyons à quoi ressemblent les données. Les documents sont utilisés pour stocker des données. Un document est un objet JSON avec une clé et une valeur. Par exemple:

`{ "name": "Jane Doe", "gender": "femme" }`

Pour l'envoyer, nous pouvons utiliser les API REST fournies par Elasticsearch. Ici, nous voulons enregistrer le document, nous utilisons donc PUT, puis nous spécifions le point de terminaison. Le point de terminaison est le nom de l'index où les données seront stockées. Par exemple ici, nous choisissons 'voitures' comme index. Il faudra aussi préciser qu'il s'agit d'un document et lui donner un id. Une fois envoyée, la requête ci-dessous demandera l'ajout du document nouvellement créé à Elasticsearch avec l'id '1' dans l'index des voitures.

`PUT voitures/_doc/1 { "marque": "Lamborghini", "propriétaire": "Pedri", "couleur": "rose" }`

En réponse, Elasticsearch nous signale que le document a été ajouté dans l'index spécifié avec la version 1 car nous venons de créer le document et le champ résultat qui va nous renseigner sur l'opération qui vient d'être effectuée, ici la création.

`{ "_index": "voitures", "_id": "1", "_version": 1, "result": "créé", "_shards": { "total": 2, "réussi": 1, "échec " : 0 }, "_seq_no": 0, "_primary_term": 1 }`

Si, par exemple, on relance la même requête en changeant juste la marque de la voiture, on obtient comme réponse :

```
{ "_index": "voitures", "_id": "1", "_version": 2, "result": "mis à jour", "_shards": { "total": 2, "réussi": 1, "échec " : 0 }, "_seq_no": 1, "_primary_term": 1 }
```

Pour vérifier que la propriété _propriétaire_ a été mise à jour et que les autres propriétés sont inchangées, vous pouvez effectuer une requête GET sur le document.

Passons maintenant aux concepts d'index dans Elasticsearch. Il y a deux aspects importants à considérer : la répartition des données et la gestion du schéma de données.

1. Gestion du schéma de données:
Il est courant de penser qu'Elasticsearch ne nécessite pas de schéma, car aucun n'est spécifié lors de la création de l'index. Cependant, un schéma est automatiquement généré à chaque indexation de document, et peut être obtenu en utilisant l'endpoint_** _mapping**_. Par exemple, pour notre index de voitures, la requête suivante permet d'obtenir le schéma :

`GET voitures/_mapping`

2. Répartition des données :
Pour vérifier le nombre de nœuds Elasticsearch dans notre cluster, nous pouvons utiliser la commande suivante :

`GET _cat/nœuds`

Actuellement, il n'y a qu'une seule machine exécutant Elasticsearch. Lors de la création de l'index, Elasticsearch génère des "shards" pour répartir les données. Par défaut, un seul shard est créé par nœud, mais ce paramètre peut être modifié. Il est possible de créer des copies de ces shards appelées replicas pour assurer la disponibilité des données en cas de panne d'un nœud. Pour obtenir les paramètres de notre index, nous pouvons utiliser la commande suivante :

`GET voitures/_settings`

Nous pouvons voir qu'il y a un shard et un replica pour notre index. Pour supprimer l'index, nous pouvons utiliser la commande suivante :

`DELETE voitures`

et recréez-en un nouveau en spécifiant par exemple des paramètres tels que le nombre de shards et le nombre de répliques ainsi que le mapping :

```
PUT cars 
{ 
  "settings": { 
    "number_of_shards": 2, 
    "number_of_replicas": 1 
  }, 
  "mappings": { 
    "properties": { 
      "brand": { 
        "type": "text" 
      }, 
      "owner": { 
        "type": "texte" 
      }, 
      "couleur": { 
        "type": "texte" 
      } 
    } 
  } 
}
```

Il est possible de vérifier si les paramètres que vous avez définis ont bien été pris en compte en examinant le mappage et les réglages. N'oubliez pas de consulter la documentation officielle pour plus d'informations. 

J'espère que cet article vous a été utile. Si vous avez des questions ou des commentaires, n'hésitez pas à les partager dans les commentaires ci-dessous.

A très bientôt, Abdoul-Bagui M.