Elasticsearch – Tuto Transforms

Donnée d’origine

Elasticsearch est une base de données NOSQL orientée document (JSON) et, de ce fait, chaque document doit être vu comme étant indépendant les uns des autres.

Cependant, il peut arriver que la donnée soit interdépendante, comme avec le jeu de données ci-dessous :

Elasticsearch – Tuto Transforms

Dans cet exemple, on voit des colis avec des dates et différents statuts :

  • Demande créée
  • Pris en charge
  • Expédié
  • Livré

Il y a donc clairement un lien entre les documents et cela pose problème pour répondre à certaines questions orientées métier.

Cas d’usages

Voici quelques exemples de questions qu’il serait légitime de se poser mais que cette modélisation risque de nous empêcher de résoudre :

  1. Comment identifier facilement mes colis expédiés mais non livrés?
  2. Quel est le délai, en jours, entre la prise en charge d’un colis et son expédition?

Ces deux questions supposent un lien fort entre les documents.

Création de la transformation

La transformation doit être de type Pivot :

Elasticsearch – Tuto Transforms

Concernant la partie Group By, il faut choisir le champ num_colis :

Elasticsearch – Tuto Transforms

Cette agrégation est de type “terms” et fait référence au champ “num_colis.keyword”.

Pour les agrégations, plusieurs ont été créées :

  • 01_Demande créée : agrégation de type filter, avec la requête term sur la valeur “01_Demande créée”. Cette agrégation permet de savoir si le colis a été créé dans le système.
  • 02_Pris en charge : agrégation de type filter, avec la requête termsur la valeur “01_Pris en charge” avec deux sous agrégations :
    • event.cardinality : le colis est-il pris en charge?
    • date.max : à quelle date le colis a-t-il été pris en charge?
  • 03_Expédié : agrégation de type filter, avec la requête term sur la valeur “03_Expédié” avec deux sous agrégations :
    • event.cardinality : le colis est-il expédié?
    • date.max : à quelle date le colis a-t-il été expédié?
  • 04_Livré : agrégation de type filter, avec la requête term sur la valeur “04_Livré”. Cette agrégation permet de savoir si le colis a été livré au destinataire.
  • Date_demande : agrégation de type min,sur le champ date. Cette agrégation permet de trouver la date principale de la donnée (qui servira pour la data view ensuite)

En synthèse :

Elasticsearch – Tuto Transforms

Le résultat obtenu dans l’aperçu (suite à une réorganisation des colonnes) :

Elasticsearch – Tuto Transforms

Avec cette nouvelle vision de la donnée, il va être possible de répondre aux deux cas d’usages précédents !

Nous pouvons maintenant terminer la transformation :

Elasticsearch – Tuto Transforms

Réponse à la question 1

=> Quels sont mes colis expédiés mais non livrés?

Il est maintenant très simple d’y répondre à l’aide de filtres :

Elasticsearch – Tuto Transforms

Réponse à la question 2

=> Quel est le délai, en jours, entre la prise en charge et l’expédition d’un colis?

Pour pouvoir répondre à cette question, il faut d’abord ajouter un Runtime Field qui permet justement de calculer ce délai :

Elasticsearch – Tuto Transforms

Une fois que ce nouveau champ “delai_expedition” existe, il est très simple de surveiller ce délai dans Discover :

Elasticsearch – Tuto Transforms

Vous savez maintenant comment répondre à des questions analytiques plus complexes dans Elasticsearch !

Vous souhaitez bénéficier d'experts, de développeurs, ou d'une formation sur Elasticsearch - Kibana ? Contactez-nous !