0% ont trouvé ce document utile (0 vote)
97 vues105 pages

Introduction aux bases de données NoSQL

s4

Transféré par

AZELOUALIDINE KAWTAR
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
97 vues105 pages

Introduction aux bases de données NoSQL

s4

Transféré par

AZELOUALIDINE KAWTAR
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

NoSQL

Module: BigData et Bases de données NoSQL


Master Big Data & Cloud Computing

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 1


Introduction
Base de donnees relationnelles: RDB et RDBMS

• Données stockées dans des colonnes et des tables.


• Relations représentées par les données.
• Langage de manipulation de données.
• Langage de définition de données.
• Transactions.
• Abstraction du niveau physique.
• Les applications spécifient quoi, et non comment.
• Le niveau physique peut changer sans modifier les applications:
• Créer des index pour supporter les requêtes.
• Bases de données en mémoire.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 2


Introduction
Base de donnees relationnelles: ACID Properties

ACID Properties

Atomicity Consistency Isolation Durability

Tout le travail dans Une transaction Les résultats de tous Les résultats d'une
une transaction est transforme la base les changements transaction validée
complet (validé) ou de données d'un état effectués pendant survivent aux
rien n'est complet. cohérent en un autre une transaction ne défaillances.
état cohérent. La sont pas visibles tant
cohérence est que la transaction
définie en termes de n'a pas été validée.
contraintes.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 3


Introduction
NoSQL? Origines

NoSQL (NotOnlySQL) signifie : • Les SGBD non relationnels ne sont pas nouveaux.
• Non Relationnel
• Pas de SGBDR • Mais NoSQL représente une nouvelle incarnation.
• Pas Seulement SQL • En raison des applications Internet
massivement scalables
NoSQL est un terme générique pour toutes les • Basé sur le calcul distribué et parallèle
bases de données et magasins de données qui ne
suivent pas les principes des SGBDR. • Développement
• Commence avec Google.
• Une classe de produits • Premier article de recherche publié en 2003.
• Une collection de plusieurs concepts (liés) sur • Continue également grâce aux développeurs
le stockage et la manipulation des données de Lucene/Apache (Hadoop) et Amazon
• Souvent lié à de grands ensembles de données (Dynamo).
• Ensuite, de nombreux produits et intérêts
sont venus de Facebook, Netflix, Yahoo, eBay,
Hulu, IBM, et bien d'autres.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 4


Introduction
NoSQL: Dans le BigData

• NoSQL provient d'Internet, il est donc souvent lié au concept de « big data »

• Quelle est la taille des « big data » ?


• Plus de quelques téraoctets est suffisant pour commencer à s'étendre sur plusieurs unités de
stockage

• Défis:
• Stocker et accéder efficacement à de grandes quantités de données est difficile, d'autant plus en
considérant la tolérance aux pannes et les sauvegardes
• Manipuler de grands ensembles de données implique d'exécuter des processus immensément
parallèles
• Gérer un schéma et des métadonnées en évolution continue pour des données semi-structurées
et non structurées est difficile

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 5


Introduction
NoSQL: Raisons principales

• Explosion des sites de médias sociaux (Facebook, Twitter) avec de grands besoins
en données

• Essor des solutions basées sur le cloud telles qu'Amazon S3 (solution de stockage
simple)

• Comme le passage à des langages à typage dynamique (Python, Ruby, Groovy), un


changement vers des données à typage dynamique avec des changements
fréquents de schéma

• Communauté open-source

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 6


Introduction
NoSQL: Se contenter des RDBMS pour le BigData ?

• Le contexte est Internet

• Les SGBDR supposent que les données sont


• Denses
• Largement uniformes (données structurées)

• Les données provenant d'Internet sont


• Massives et éparses
• Semi-structurées ou non structurées

• Avec des ensembles de données massives et éparses, les


mécanismes de stockage typiques et les méthodes d'accès
sont mis à rude épreuve

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 7


Introduction
NoSQL: Caracteristiques principales

• Volumes de données importants • Sans schéma


• "Big data" de Google
• Les propriétés de transaction ACID ne
• Réplication et distribution scalables sont pas nécessaires – BASE
• Potentiellement des milliers de machines
• Potentiellement distribuées à travers le • Théorème CAP
monde
• Développement open source
• Les requêtes doivent retourner des réponses
rapidement

• Principalement des requêtes, peu de mises à


jour

• Insertions et mises à jour asynchrones

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 8


Introduction
NoSQL vs SQL

Base de données SQL (DB SQL) Base de données NoSQL (DB NoSQL)

Exemples : CouchDb, MongoDB, RavenDb, Redis, Cassandra, Hbase,


Exemples : DB2, MySQL, Oracle, Postgress, serveur SQL
Neo4j, BigTable
Elles sont appelées SGBDR (Systèmes de Gestion de Base de Données
Elles sont appelées bases de données pas seulement SQL.
Relationnels).
Basées sur les propriétés ACID c'est-à-dire Atomicité, Cohérence, Basées sur les propriétés CAP, c'est-à-dire Cohérence, Disponibilité et
Isolation et Durabilité. Tolérance de partition.
Ce sont des bases de données basées sur des tables, c’est-à-dire que
Ces bases de données sont basées sur des documents, des paires clé-
les données sont stockées dans une table avec des lignes et des
valeur ou sont basées sur des graphes, etc.
colonnes.
Elles ne sont pas basées sur un schéma standard (schéma
Elles sont basées sur un schéma standard (schéma prédéfini).
dynamique).
Elles sont dimensionnées verticalement. La charge peut être gérée en Elles sont dimensionnées horizontalement. Quelques serveurs peuvent
augmentant le CPU, la RAM, etc. dans le même serveur. être ajoutés pour gérer un grand trafic.
Non recommandées pour de grands ensembles de données / big data. Préférées pour de grands ensembles de données / big data.

Préférées pour l'exécution de requêtes complexes. Non recommandées pour l'exécution de requêtes complexes.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 9


Introduction
NoSQL: Database types

Discuter des bases de données NoSQL est compliqué car il existe une variété de types :

Sorted ordered Column Store (column oriented):


Optimisé pour les requêtes sur de grands ensembles de données, et stocke les colonnes de données
ensemble, au lieu des lignes.

Document Databases:
Associent chaque clé à une structure de données complexe connue sous le nom de document.

Key Value Store:


Sont les bases de données NoSQL les plus simples. Chaque élément dans la base de données est
stocké comme un nom d'attribut (ou 'clé'), avec sa valeur.

Graph databases:
Sont utilisées pour stocker des informations sur des réseaux de données, comme les connexions
sociales.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 10


Introduction
NoSQL: Document database

• Documents
• Ensembles de paires clé/valeur structurellement relâchés dans les
documents, par exemple, XML, JSON
• Encapsulent et codent les données dans certains formats ou encodages
standards
• Sont adressés dans la base de données via une clé unique
• Les documents sont traités comme un tout, évitant de diviser un document
en ses paires nom/valeur constitutives

• Permettent de récupérer les documents par clés ou contenus

• Notable pour :
• MongoDB (utilisé dans FourSquare, GitHub, et plus)
• CouchDB (utilisé dans Apple, BBC, Canonical, Cern, et plus)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 11


Introduction
NoSQL: Key / Value pairs

• Stocker les données de manière sans schéma

• Stocker les données sous forme de Map:


• HashMaps ou tableaux associatifs
• Fournir un algorithme de temps d'exécution moyen Key Value
très efficace pour accéder aux données
name SQ5
• Notable pour:
• Couchbase (Zynga, Vimeo, NAVTEQ, ...) brand AUDI
• Redis (Craiglist, Instagram, StackOverflow, flickr, ...)
• Amazon Dynamo (Amazon, Elsevier, IMDb, ...)
year 2020
• Apache Cassandra (Facebook, Digg, Reddit, Twitter,
...)
• Voldemort (LinkedIn, eBay, …)
• Riak (Github, Comcast, Mochi, ...)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 12


Introduction
NoSQL: Sorted Ordered Column Oriented Store (Column Oriented)

• Les données sont stockées de manière orientée colonne


• Les données sont stockées efficacement:
• Évite de consommer de l'espace pour stocker des valeurs
nulles
• Les colonnes sont regroupées en familles de colonnes
• Les données ne sont pas stockées sous forme de table
unique mais sont stockées par familles de colonnes
• L'unité de données est un ensemble de paires clé/Valeur:
• Identifiées par une "clé de ligne"
• Ordonnées et triées en fonction de la clé de ligne

• Notable pour :
• Bigtable de Google (utilisé dans tous les services de
Google)
• HBase (Facebook, StumbleUpon, Hulu, Yahoo!, ...)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 13


Introduction
NoSQL: Graph Oriented

• Tout est stocké sous forme de


liaison (Edge), de nœud (Node) ou
d'attribut.
• Chaque nœud et liaison peut avoir
un nombre quelconque d'attributs.
• Les nœuds et les liaisons peuvent
être étiquetés.
• Les étiquettes peuvent être
utilisées pour affiner les
recherches.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 14
Introduction
NoSQL: Scalability

• Problèmes de mise à l'échelle lorsque • Les solutions NoSQL sont conçues pour
l'ensemble de données est tout simplement fonctionner sur des clusters ou des
trop grand solutions de base de données multi-
nœuds
• Les SGBDR n'ont pas été conçus pour être • De plus grands volumes de
distribués données/opérations nécessitent
d'ajouter plus de machines au
• Les SGBD traditionnels sont mieux conçus cluster, connu sous le nom de 'mise
pour fonctionner correctement sur une "seule" à l'échelle horizontale’
machine: • Les différentes approches
comprennent :
• De plus grands volumes de • Maître-esclave
données/opérations nécessitent de mettre • Sharding (partitionnement)
à niveau le serveur avec des processeurs
plus rapides ou plus de mémoire, connu
sous le nom de 'mise à l'échelle verticale’

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 15


Introduction
NoSQL: No ACID, BASE instead

• Les SGBDR sont basés sur les propriétés ACID Acronyme BASE conçu pour être
(Atomicité, Cohérence, Isolation et Durabilité) l'opposé d'ACID:
• Basically available
• NoSQL • Soft State
• Ne donne pas d'importance aux propriétés • Eventually Consistent
ACID
• Dans certains cas, les ignore complètement Caractéristiques:
• Cohérence faible – données
• Dans les systèmes parallèles distribués, il est périmées acceptables
difficile/impossible d'assurer les propriétés ACID: • Disponibilité prioritaire
• Les transactions de longue durée ne • Meilleur effort
fonctionnent pas car garder les ressources • Réponses approximatives
bloquées pendant longtemps n'est pas acceptables
pratique • Aggressif (optimiste)
• Plus simple et plus rapide

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 16


Introduction
NoSQL:CAP THEOREM

Le théorème CAP fournit une manière cohérente et


logique d'évaluer les problèmes liés à l'assurance de
garanties similaires à ACID dans les systèmes distribués

Au maximum deux des trois suivants peuvent être


maximisés en même temps

•Cohérence (Consistency)
• Chaque client a la même vue des données

•Disponibilité (Availability)
• Chaque client peut toujours lire et écrire

•Tolérance au partitionnement (Partition Tolerance)


• Le système fonctionne bien à travers des
réseaux physiques distribués

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 17


Introduction
NoSQL: CAP THEOREM

Théorème CAP – Au maximum deux propriétés sur trois peuvent être


adressées,

Les choix pourraient être les suivants :

1. La disponibilité est compromise mais la cohérence et la tolérance au


partitionnement sont préférées

2. Le système a peu ou pas de tolérance au partitionnement. La


cohérence et la disponibilité sont préférées

3. La cohérence est compromise mais les systèmes sont toujours


disponibles et peuvent fonctionner lorsque des parties sont
partitionnées

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 18


Introduction
NoSQL: Consistence ou Disponibilite

La cohérence et la disponibilité ne
sont pas une décision "binaire"
• Les systèmes AP relâchent la
cohérence en faveur de la disponibilité
– mais ne sont pas inconsistants
• Les systèmes CP sacrifient la
disponibilité pour la cohérence – mais
ne sont pas indisponibles
• Cela suggère que les systèmes AP et
CP peuvent offrir un degré de
cohérence et de disponibilité, ainsi que
de tolérance au partitionnement

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 19


Introduction
NoSQL: Dans quel contexte

Où utiliserais-je une base de données NoSQL ?

• Avez-vous quelque part un grand ensemble de données non contrôlées, non


structurées que vous essayez d'intégrer dans un SGBDR ?

• Analyse de logs

• Flux de réseaux sociaux (de nombreuses entreprises connectées via Facebook ou


Twitter)

• Flux externes de partenaires

• Données qui ne sont pas facilement analysables dans un SGBDR, comme les
données basées sur le temps

• Grands flux de données qui doivent être traités avant l'entrée dans un SGBDR

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 20


NoSQL Document Database
Formats de données non-structuré

Données Binaires

• Souvent, nous voulons stocker des objets (instances de classe).


• Les objets peuvent être sérialisés en binaire (marshalled).
• Et conservés dans un magasin de clé-valeur.
• Il existe plusieurs formats de sérialisation populaires :
• Protocol Buffers, Apache Thrift.

Données Textuelles Structurées

JSON, BSON (Binary JSON): JavaScript Object Notation


JSON est actuellement le format de données numéro un utilisé sur le Web.
XML : eXtensible Markup Language
RDF : Resource Description Framework

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 21


NoSQL Document Database
XML: Informations basiques

XML : eXtensible Markup Language • Exemple:


• Standard du W3C (depuis 1996).
<?xml version="1.0" encoding="UTF-8"?>
• Conçu pour être lisible tant par les
<library>
humains que par les machines. <book id="1">
<title>The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<year>1925</year>
<genre>Fiction</genre>
</book>
<book id="2">
<title>Nineteen Eighty-Four</title>
<author>George Orwell</author>
<year>1949</year>
<genre>Dystopian</genre>
</book>
</library>
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 22
NoSQL Document Database
XML: Fonctionnalités et comparaison

Moyens standards pour spécifier le schéma d'un document XML :


DTD Document Type Definition, XML Schema, etc.
Concept des namespaces (<h:td>); éditeurs XML (pour un schéma donné).

Technologies pour l'analyse syntaxique :


DOM (Document Object Model), SAX (Simple API for XML)

Nombreuses technologies associées :


XPath, XQuery, XSLT (transformation).

XML est bon pour les configurations, les métadonnées, etc.


Les bases de données XML sont matures, elles ne sont pas considérées comme NoSQL.

Actuellement, le format JSON domine :


Compact, plus facile à écrire, répond à la plupart des besoins.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 23
NoSQL Document Database
JSON: Informations basiques

• Standard ouvert basé sur le texte pour l'échange de • Exemple:


données
• Sérialisation et transmission de données {
structurées. _id: ObjectId("51156a1e056d6f966f268f81"),
type: "Article",
author: "Derick Rethans",
• JSON = JavaScript Object Notation title: "Introduction to Document Databases with MongoDB",
• Initialement spécifié par Douglas Crockford en date: ISODate("2013-04-24T[Link].911Z"),
body: "This arti…"
2001. },
• Dérivé du langage de script JavaScript.
• Utilise les conventions de la famille du langage C. {
_id: ObjectId("51156a1e056d6f966f268f82"),
type: "Book",
• Nom de fichier : *.json author: "Derick Rethans",
title: "php|architect's Guide to Date and Time Programming
with PHP",
• Type de média Internet (MIME) : application/json isbn: "978-0-9738621-5-7"
}
• Indépendant du langage

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 24


NoSQL Document Database
JSON: Types de données (1)

Objet – un ensemble non ordonné de paires Nom+Valeur


Ces paires sont appelées propriétés (membres) de l'objet.
Syntaxe : { nom: valeur, nom: valeur, nom: valeur, ...}

Tableau – une collection ordonnée de valeurs (éléments)


Syntaxe : [ valeurs séparées par des virgules ]

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 25


NoSQL Document Database
JSON: Types de données (2)

Valeur:

• Chaîne de caractères entre guillemets • Vrai ou faux (c'est-à-dire, Booléen)


• Doubles • Null
• Nombre • Objet
• Tableau

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 26


NoSQL Document Database
JSON: Types de données (3)

Chaîne de caractères:

• Séquence de zéro ou plusieurs caractères Unicode, encadrée de guillemets doubles


• Échappement avec un backslash

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 27


NoSQL Document Database
JSON: Types de données (4)

Nombre:
• Semblable à un nombre en C, Python, ou Java
• Entier ou flottant
• Les formats octal et hexadécimal ne sont pas utilisés

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 28


NoSQL Document Database
JSON: Propriétés

• Il n'y a pas de commentaires dans le JSON


• À l'origine, il y en avait, mais ils ont été retirés pour des raisons de sécurité.

• Aucun moyen de spécifier la précision/taille des nombres


• Cela dépend du parseur et du langage de programmation.

• Il existe une norme "Schéma JSON"


• Un moyen de spécifier le schéma des données.
• Noms de champs, types de champs, champs obligatoires/optionnels, etc.
• Le Schéma JSON est bien sûr écrit en JSON.
• Voir exemple ci-dessous

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 29


NoSQL Document Database
JSON: Exemple avec Schéma (JSON En question)

{
"string": "This is a string",
"number": 123,
"object": {
"key1": "value1",
"key2": 2
},
"array": [1, "two", true, null, {"nestedKey": "nestedValue"}],
"booleanTrue": true,
"booleanFalse": false,
"nullValue": null
}

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 30


NoSQL Document Database
JSON: Exemple avec Schéma (Schéma associé)
{ "array": {
"type": "array",
"$schema": "[Link] "items": {
"title": "Example Schema", "oneOf": [
"type": "object", {"type": "number"},
"properties": { {"type": "string"},
{"type": "boolean"},
"string": { {"type": "null"},
"type": "string" {
}, "type": "object",
"properties": {
"number": { "nestedKey": {"type": "string"}
"type": "number" },
}, "required": ["nestedKey"]
"object": { }
]
"type": "object", }
"properties": { },
"key1": { "booleanTrue": {
"type": "string" "type": "boolean"
},
}, "booleanFalse": {
"key2": { "type": "boolean"
"type": "number" },
} "nullValue": {
"type": "null"
}, }
"required": ["key1", "key2"] },
}, "required": ["string", "number", "object", "array", "booleanTrue", "booleanFalse", "nullValue"]
}
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 31
NoSQL Document Database
MongoDB: Informations de base

• Sortie initiale : 2009


• Écrit en C++
• Open-source
• Multiplateforme
• Documents JSON
• Fonctionnalités de base :
• Haute performance – nombreux index
• Haute disponibilité – réplication + cohérence éventuelle + basculement
automatique
• Mise à l'échelle automatique – fragmentation automatique à travers le cluster
• Support de MapReduce

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 32


NoSQL Document Database
MongoDB: Terminologie

RDBMS MongoDB
database instance MongoDB instance
schema database
table collection
row document
rowid _id

• Chaque document JSON:


• Appartient à une collection
• Possède un champ _id
• Unique au sein de la collection

• Chaque collection:
• Appartient à une « Base de données »

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 33


NoSQL Document Database
MongoDB: Caractéristiques

Utiliser JSON pour la communication d’API

En interne : BSON
• Représentation binaire de JSON
• Pour le stockage et la communication entre serveurs

• Le document a une taille maximale : 16 Mo (en BSON)


• Ne pas utiliser trop de RAM
• L’outil GridFS peut diviser des fichiers plus volumineux en
fragments

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 34


NoSQL Document Database
MongoDB: Fields

Chaque document doit comporter un champ _id


• Utilisé comme clé primaire
• Unique au sein de la collection
• Immuable
• Tout type autre qu’un tableau
• Peut-être généré automatiquement

Restrictions sur les noms de champs :


• Les noms de champs ne peuvent pas commencer par le caractère $
• Réservé aux opérateurs
• Les noms de champ ne peuvent pas contenir le caractère (.)
• Réservé à l’accès aux sous-champs

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 35


NoSQL Document Database
MongoDB: Schema

Les documents ont un schéma flexible


• Les collections n’appliquent pas de structure de données spécifique
• Dans la pratique, les documents d’une collection sont similaires

Décision clé de la modélisation des données :


• Références vs. documents intégrés

En d’autres termes : où tracer des lignes entre les agrégats ?


• Structure des données
• Relations entre les données

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 36


NoSQL Document Database
MongoDB: Embedded Docs

Données associées dans une seule structure de document


Les documents peuvent avoir des sous-documents (dans un champ ou un tableau)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 37


NoSQL Document Database
MongoDB: Embedded Docs (2)

• Schéma dénormalisé
• Principal avantage :
• Manipulez les données associées en une seule opération
• Utilisez ce schéma dans les cas suivants :
• Relations one-to-one : un document « contient » l’autre
• One-to-many : si les documents enfants ont un document parent

• Inconvénients:
• Les documents peuvent augmenter considérablement au fil du temps
• Impacte les performances de lecture/écriture
• Le document doit être déplacé sur le disque si sa taille dépasse l’espace alloué
• Peut entraîner une fragmentation des données sur le disque

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 38


NoSQL Document Database
MongoDB: Références

Liens/références d’un document à l’autre


• Normalisation du schéma

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 39


NoSQL Document Database
MongoDB: Références (2)

• Plus de flexibilité que l’intégration


• Utiliser les références :
• Lorsque l’intégration entraînerait une duplication des données
• Augmentation insignifiante des performances de lecture
• Pour représenter des relations Many-To-Many plus complexes
• Pour modéliser de grands ensembles de données hiérarchiques

• Inconvénients:
• Peut nécessiter plus d’allers-retours vers le serveur
• Les documents sont accessibles un par un

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 40


NoSQL Document Database
MongoDB: Querying

• Langage de requête Mongo


• Une requête MongoDB :
• Cible une collection spécifique de documents
• Spécifie les critères qui identifient les documents renvoyés
• Peut inclure une projection pour spécifier les champs retournés
• Peut imposer des limites, trier, ordre, ...

• Requête de base - tous les documents de la collection :


[Link]() -- Like SELECT *

[Link]( {} )

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 41


NoSQL Document Database
MongoDB: Exemple

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 42


NoSQL Document Database
MongoDB: Selection

[Link]({ type : « collations » })


Tous les documents de l’inventaire des collections où le champ type a la valeur
collations

[Link]({ type : { $in : [ 'nourriture', 'collations' ] } } )


Tous les documents d’inventaire dont le champ de type est soit nourriture,
soit collations

[Link]({ type : 'nourriture', prix : { $lt : 9.95 } } )

Tout... où le champ type est nourriture et le prix est inférieur à 9,95


3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 43
NoSQL Document Database
MongoDB: Insertion

[Link]( { _id: 10, type: "misc", item: "card", qty: 15 } )


Insère un document comportant trois champs dans l’inventaire de la
collection
Champ _id spécifié par l’utilisateur

[Link]({ type: "book", item: "journal" } )


La base de données génère le champ _id

$ [Link]()
{ "_id": ObjectId("58e209ecb3e168f1d3915300"), type: "book", item:
"journal" }

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 44


NoSQL Document Database
MongoDB: Update

[Link](
{ type: "book", item : "journal" },
{ $set: { qty: 10 } },
{ upsert: true } )
Recherche tous les documents correspondants a ces critères :
{ type: "book", item : "journal" }
Puis modifie QTY ({ qty: 10 })

upsert: true :
Si aucun document de la collection d’inventaire ne correspond pas
Crée un nouveau document (généré _id):
Contient les champs _id, type, item, qté
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 45
NoSQL Document Database
MongoDB: MapReduce

collection "accesses":
{
"user_id": <ObjectId>,
"login_time": <time_the_user_entered_the_system>,
"logout_time": <time_the_user_left_the_system>,
"access_type": <type_of_the_access>
}

Combien de temps chaque utilisateur a-t-il passé connecté ?


Ne compter que les accès de type « regular »
[Link](
function() { emit (this.user_id, this.logout_time - this.login_time); },
function(key, values) { return [Link]( values ); },
{
query: { access_type: "regular" },
out: "access_times"
}
)
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 46
NoSQL Document Database
MongoDB: Indexes

• Les indexes sont la clé des performances de MongoDB


• Sans index, MongoDB doit analyser chaque document d’une collection pour
sélectionner les documents correspondants
• Les index stockent certains champs sous une forme facilement accessible
• Stocke les valeurs d’un ou de plusieurs champs spécifiques, classées par la
valeur
• Défini par collection
• But:
• Pour accélérer les requêtes courantes
• Pour optimiser les performances d’autres opérations spécifiques

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 47


NoSQL Document Database
MongoDB: Indexes (Exemple)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 48


NoSQL Document Database
MongoDB: Indexes (Exemple)

L’index peut être parcouru afin de renvoyer des résultats triés (sans tri) :
Dans ce cas Décroissant (Valeur -1)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 49


NoSQL Document Database
MongoDB: Type d’indexes

Valeur par défaut : _id (DEFAULT)


Existe par défaut
Si les applications ne spécifient pas _id, il est créé.
Unique

Champ unique (SINGLE FIELD)


Index définis par l’utilisateur sur un seul champ d’un document

Composé (COMPOUND)
Index définis par l’utilisateur sur plusieurs champs

Index multiclé (MultiKey index)


Pour indexer le contenu stocké dans des tableaux
Crée une entrée d’index distincte pour chaque élément du tableau

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 50


NoSQL Document Database
MongoDB: Type d’indexes

DEFAULT

MULTI-KEY

COMPOUND

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 51


NoSQL Document Database
MongoDB: Type d’indexes (2)

• Ordered Index
• B-Tree

• Hash Indexes
• Fast O(1) indexe le hachage de la valeur d’un champ
• Only equality matches

• Geospatial Index
• 2d indexes = Utiliser la géométrie plane lors du renvoi des résultats
• Pour les données représentant des points sur un plan bidimensionnel
• 2sphere indexes = spherical (Earth-like) geometry
• Pour les données représentant la longitude, la latitude

• Text Indexes
• Recherche de contenu de chaîne dans une collection

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 52


NoSQL Document Database
MongoDB: Atelier 1 - Intro

Installation MongoDB Shell: [Link]

Installation MongoDB Compass: [Link]

Ouvrir Le terminal, CMD ou PoweShell, Puis se connecter la BD de test:


mongosh "mongodb://admin:qazwsx%2B-123@[Link]:27017/?authMechanism=DEFAULT"

Créer une base de données : BD2C


use BD2C;

Créer une collection : produits


[Link]("produits")

Créer (Insertion de documents) :


[Link]({nom: "T-shirt", prix: 19.99, categorie: "Vetements"})

Lire (Récupération de documents) :


[Link]({categorie: "Vetements"})

Mettre à jour (Modification de documents) :


[Link]( { nom: "T-shirt" }, { $set: { prix: 29.99 } } )

Supprimer (Effacement de documents) :


[Link]({ nom: "T-shirt" })

Aggrégations
[Link]([ { $match: { categorie: "Vetements" } }, { $group: { _id: "$categorie", total: { $sum: "$prix" } } } ])

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 53


NoSQL Document Database
MongoDB: Atelier 1 - Indexes

Créer une collection : clients Requête sans index :


[Link]("clients") var start = new Date()
[Link]({ ville: "Ville50" }).toArray()
Lancer le script de creation en masse: var end = new Date()
let clients = []; print("Durée sans index: ", end - start, "ms")

for (let i = 1; i <= 100000; i++) {


[Link]({ Création d'un index :
_id: i, [Link]({ ville: 1 })
nom: `Client${i}`,
email: `client${i}@[Link]`,
ville: `Ville${i % 100}` // cela générera 100 villes différentes, de Ville0 à Ville99 Requête avec index :
}); var start = new Date()
[Link]({ ville: "Ville50" }).toArray()
// Insertion en blocs de 1000 pour optimiser la performance var end = new Date()
if (i % 1000 === 0) { print("Durée avec index: ", end - start, "ms")
[Link](clients);
clients = []; // Réinitialiser le tableau après l'insertion
}
}

// S'assurer que le dernier lot soit aussi inséré si le nombre n'est pas un multiple de 1000
if ([Link] > 0) {
[Link](clients);
}

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 54


NoSQL Document Database
MongoDB: Atelier 1 – Agrégations
Étape 2 : Requête d'agrégation
Étape 1 : Préparation des collections [Link]([
{
$lookup: {
Collection clients : from: "clients",
[Link]([ { _id: 1, nom: "Alice", ville: "Paris" }, { _id: 2, localField: "clientId",
foreignField: "_id",
nom: "Bob", ville: "Lyon" }, { _id: 3, nom: "Carla", ville: "Marseille" } as: "client_info"
]); }
},
{
Collection produits : $lookup: {
from: "produits",
[Link]([ { _id: 1, nom: "Téléphone", prix: 700 }, { localField: "produitId",
_id: 2, nom: "Ordinateur", prix: 1500 }, { _id: 3, nom: "Tablette", foreignField: "_id",
as: "produit_info"
prix: 450 } ]); }
},
{
Collection achats : $unwind: "$client_info"
[Link]([ { clientId: 1, produitId: 1, quantite: 1 }, { },
{
clientId: 1, produitId: 2, quantite: 2 }, { clientId: 2, produitId: 2, $unwind: "$produit_info"
quantite: 1 }, { clientId: 3, produitId: 3, quantite: 3 } ]); },
{
$group: {
_id: "$client_info.nom",
total_depense: {
$sum: { $multiply: ["$quantite", "$produit_info.prix"] }
},
produits_achetés: {
$push: {
produit: "$produit_info.nom",
quantite: "$quantite",
prix_unitaire: "$produit_info.prix",
prix_total: { $multiply: ["$quantite", "$produit_info.prix"] }
}
}
}
}
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI
]).pretty(); 55
NoSQL Document Database
MongoDB: Derrière les rideaux

• BSON format
• Distribution models:
• Replication
• Sharding
• Balancing
• MapReduce
• Transactions
• Journaling
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 56
NoSQL Document Database
MongoDB: BSON

• Sérialisation codée en binaire de documents JSON


• Représentation de documents, de tableaux, de types de données JSON simples
+ d’autres types (par exemple, date)

Types possibles:
❖ byte– 1 byte (8-bits) ❖ int64– 8 bytes (64-bit signed integer)
❖ int32– 4 bytes (32-bit signed integer) ❖ double– 8 bytes (64-bit IEEE 754 floating point)
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 57
NoSQL Document Database
MongoDB: Grammaire BSON

Document ::= Int32 e_list "\x0" e_list ::= élément e_list | ""
• Document BSON • Séquence d’éléments
• int32 = nombre total d’octets dans le document

element ::= "\x01" e_name double Floating point


| "\x02" e_name string UTF-8 string
| "\x03" e_name document Embedded document Array
| "\x04" e_name document
Binary data
| "\x05" e_name binary

| …
e_name ::= cstring
● Field key

cstring ::= (byte*) "\x00"


string ::= int32 (byte*) "\x00"
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 58
Data Replication
Introduction:

Réplication maître/esclave
Jeu de réplicas = groupe d’instances qui
hébergent le même ensemble de données
Primaire (maître) – gère toutes les
opérations d’écriture
Secondaires (esclaves) : appliquent des
opérations à partir du primaire afin
qu’elles aient le même ensemble de
données.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 59


Data Replication
Operations: Read & Write

• Opération d’écriture :
• L’opération d’écriture est appliquée sur le serveur principal
• L’opération est enregistrée dans l’oplog de primary (journal des
opérations)
• Les secondaires répliquent l’oplog + appliquent les opérations à leurs
ensembles de données

• Lecture : Tous les membres du set de réplicas peuvent accepter les lectures
• Par défaut, l’application dirige ses lectures vers le serveur principal
• Garantit la dernière version d’un document
• Diminue le débit de lecture
• Le mode de préférence de lecture peut être défini
• Voir ci-dessous:
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 60
Data Replication
Operations: Read & Write (Modes)

Read Preference Mode Description

primary operations read from the primary of the replica set

primaryPreferred operations read from the primary, but if unavailable, operations read
from secondary members

secondary operations read from the secondary members

secondaryPreferred operations read from secondary members, but if none is available,


operations read from the primary

nearest operations read from the nearest member (= shortest ping time) of the
replica set

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 61


Data Replication
Replication Set Elections

Si la primaire n’est plus disponible, une élection détermine une


nouvelle primaire
• Les élections ont besoin d’un certain temps
• Pas de primaire => pas d’écriture

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 62


Data Sharding
Répartition des collections

• MongoDB permet la répartition des collections


• Mongo partitionne les données de la collection à l’aide de la clé de
partition:
• Champ(s) indexé(s) existant dans chaque document de la
collection
• Immuable
• Divisé en morceaux, répartis sur des partitions
• Partitionnement basé sur la plage
• Partitionnement basé sur le hachage
• Lorsqu’un morceau dépasse la limite de taille, il est divisé
• Modification des métadonnées, pas de migration des
données
• Équilibrage des données :
• Migration de blocs en arrière-plan

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 63


Data Sharding
Composants

• MongoDB s’exécute dans un cluster de différents types de


nœuds:

• Shards – stockent les données


• Chaque partition est un jeu de répliques
• Il peut s’agir d’un nœud unique

• Routeurs de requête – interface avec les applications clientes


• Diriger les opérations vers la ou les partitions concernées
• + retourner le résultat au client
• Diviser la charge de la demande client

• Serveurs de configuration : stockent les métadonnées du


cluster
• Mappage de l’ensemble de données du cluster aux
partitions
• Nombre recommandé : 3
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 64
NoSQL Document Database
MongoDB: Atelier 2 - Réplication

Étape 1 : Installer MongoDB

Tout d’abord, vous devrez installer MongoDB s’il n’est pas déjà installé. Vous pouvez le faire en ajoutant le référentiel MongoDB et en
installant le package MongoDB. Importez la clé publique utilisée par le système de gestion des paquets :
wget -qO - [Link] | sudo apt-key add -

Créez un fichier de liste pour MongoDB :


echo "deb [ arch=amd64,arm64 ] [Link] jammy/mongodb-org/6.0 multiverse" | sudo tee
/etc/apt/[Link].d/[Link]

Rechargez la base de données des paquets locaux et installez MongoDB :


sudo apt-get update
sudo apt-get install -y mongodb-org

Étape 2: Configurez les instances MongoDB:

Vous allez configurer trois instances sur des ports différents. Créez des répertoires distincts pour leurs données et leurs fichiers
journaux, et créez des fichiers de configuration pour chacun d’entre eux; Créez des répertoires pour les données et les journaux :
sudo mkdir -p /var/lib/mongo/rs0-1 /var/lib/mongo/rs0-2 /var/lib/mongo/rs0-3
sudo mkdir -p /var/log/mongodb/rs0-1 /var/log/mongodb/rs0-2 /var/log/mongodb/rs0-3

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 65


NoSQL Document Database
MongoDB: Atelier 2 - Réplication

Étape 2: Configurez les instances MongoDB (Suite): Étape 3 : Démarrer les instances MongoDB

Créez des fichiers de configuration : Lancez chaque instance MongoDB avec son fichier de configuration :
For instance 1 (/etc/[Link]): nohup sudo mongod --config /etc/[Link] &
storage: nohup sudo mongod --config /etc/[Link] &
dbPath: /var/lib/mongo/rs0-1 nohup sudo mongod --config /etc/[Link] &
systemLog:
destination: file
path: /var/log/mongodb/rs0-1/[Link] Étape 4: Initialiser le jeu de réplicas
logAppend: true
net: Connectez-vous à la première instance MongoDB :
port: 27017 mongo --port 27017
replication:
replSetName: rs0 Initialisez le jeu de réplicas :
[Link]()

Dupliquez cette configuration pour les deux autres instances, en


modifiant dbPath, path et port en conséquence: Étape 5 : Ajouter d’autres instances au jeu de réplicas

/etc/[Link] pour le port 27018 Toujours dans le shell MongoDB, ajoutez les deux autres instances
et [Link]("localhost:27018")
/etc/[Link] pour le port 27019. [Link]("localhost:27019")

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 66


NoSQL Document Database
MongoDB: Atelier 2 - Réplication

Étape 6 : Vérifier la configuration du jeu de réplicas

Vérifiez l’état de votre jeu de réplicas pour vous assurer que tous les membres ont été ajoutés et que le jeu de réplicas
fonctionne correctement :
[Link]()

Étape 7 : Configurez votre application

Mettez à jour la chaîne de connexion MongoDB de votre application pour inclure tous les membres du jeu de réplicas, ce qui
permet d’activer le basculement automatique. Voici un exemple de chaîne de connexion:
mongodb://first_server_ip:27017,second_server_ip:27017,third_server_ip:27017/?replicaSet=rs0

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 67


NoSQL Key-Value Database
Redis: Histoire

• Début 2009 - Salvatore Sanfilippo, un développeur italien, a lancé le projet Redis, Il


travaillait sur une solution d’analyse Web en temps réel et a constaté que MySQL
ne pouvait pas fournir les performances nécessaires.

• Juin 2009 - Redis a été déployé en production pour le site Web d’analyse Web en
temps réel LLOOGG.

• Mars 2010 - VMWare engage Sanfilippo pour travailler à plein temps sur Redis
(reste sous licence BSD).

• Par la suite, VMWare a embauché Pieter Noordhuis, un contributeur majeur de


Redis, pour l’aider sur le projet.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 68
NoSQL Key-Value Database
Redis: Fonctionnement traditionnel

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 69


NoSQL Key-Value Database
Redis: Logical Data Model

Key
Printable ASCII

Value
Primitives
Strings
Containers (of strings)
Hashes
Lists
Sets
Sorted Sets
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 70
NoSQL Key-Value Database
Redis: Logical Data Model

Key
Printable ASCII

Value
Primitives
Strings
Containers (of strings)
Hashes
Lists
Sets
Sorted Sets
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 71
NoSQL Key-Value Database
Redis: Logical Data Model

Key
Printable ASCII

Value
Primitives
Strings
Containers (of strings)
Hashes
Lists
Sets
Sorted Sets
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 72
NoSQL Key-Value Database
Redis: Logical Data Model

Key
Printable ASCII

Value
Primitives
Strings
Containers (of strings)
Hashes
Lists
Sets
Sorted Sets
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 73
NoSQL Key-Value Database
Redis: Logical Data Model

Key
Printable ASCII

Value
Primitives
Strings
Containers (of strings)
Hashes
Lists
Sets
Sorted Sets
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 74
NoSQL Key-Value Database
Redis: Relationnel vs Redis model

Relational Model Redis Model


carts set carts_james ( 1 3 ) set
CartID User carts_chris ( 2 ) hash
1 james cart_1 {
2 chris
user : "james"
3 james
product_28 : 1
cart_lines product_372: 2
Cart Product Qty }
1 28 1 hash cart_2 {
1 372 2 user : "chris"
2 15 1 product_15 : 1
2 160 5 product_160: 5
2 201 7 product_201: 7
}
UPDATE cart_lines
SET Qty = Qty + 2 HINCRBY cart_1 product_28 2
WHERE
3/6/2024 Cart=1 AND Product=28 BD2C - University of Hassan II - Noussair FIKRI 75
NoSQL Key-Value Database
Redis: Operations atomiques – KV Stores

Strings - O(1) Hashes - O(1)


GET key HGET key field
SET key value HSET key field value
EXISTS key HEXISTS key field
DEL key HDEL key field

SETNX key value Hashes - O(N)


Définir si n’existe pas HMGET key f1 [f2 ...]
Obtenir les champs d’un hachage
GETSET key value
Obtenir l’ancienne valeur, KKEYS key | HVALS key
définir la nouvelle Toutes les clés/valeurs de
3/6/2024
hachage
BD2C - University of Hassan II - Noussair FIKRI 76
NoSQL Key-Value Database
Redis: Operations atomiques – Sets
Sorted Sets - O(1)
Sets - O(1) ZCARD key
SADD, SREM, SCARD Renvoie la cardinalité
SPOP key de l’ensemble trié
Return random
member of the set Sorted Sets - O(log(N))
ZADD key score member
Sets - O(N) ZREM key member
SDIFF key1 key2 ZRANK key member
SUNION key1 key2
Sorted Sets - O(log(N)+M))
Sets - O(C) ZRANGE key start stop
SINTER key1 key2 ZRANGEBYSCORE key min max
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 77
NoSQL Key-Value Database
Redis: Atelier 1 – Installation Redis et CLI

Étape 1 : Installer Redis

curl -fsSL [Link] | sudo gpg --dearmor -o /usr/share/keyrings/[Link]

sudo chmod 644 /usr/share/keyrings/[Link]

echo "deb [signed-by=/usr/share/keyrings/[Link]] [Link] $(lsb_release -cs) main" |


sudo tee /etc/apt/[Link].d/[Link]

sudo apt-get update

sudo apt-get install redis-stack-server

Étape 2 : Démarrer le service Redis Étape 3 : Lancer Command Line Redis CLI

service redis-stack-server start redis-cli

VOUS DEVEZ AVOIR: [Link]:6379>

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 78


NoSQL Key-Value Database
Redis: Atelier 1 – Manipulations

Manipulation 1 : Gestion des clés

SET session_user_id "Mohamed" - Enregistre ' Mohamed ' comme ID de session

GET session_user_id - Récupère l'ID de session

DEL session_user_id - Supprime la clé de session

EXISTS session_user_id - Vérifie si la clé de session existe

KEYS session_* - Trouve toutes les clés de session

EXPIRE session_user_id 300 - Définit un timeout de 5 minutes pour la clé

Manipulation 2 : Ensembles

SADD group1 "Mohamed" - Ajoute 'Mohamed' à 'group1'

SMEMBERS group1 - Liste tous les membres de 'group1'

ZADD leaderboard 50 "Mohamed" - Ajoute 'Mohamed' avec un score de 50 au leaderboard

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 79


NoSQL Key-Value Database
Redis: Atelier 1 – Manipulations
Manipulation 3 : Strings et Listes

APPEND username "_verified" - Transforme 'Mohamed' en 'Mohamed_verified'

STRLEN username - Retourne la longueur de 'username'

LPUSH todolist "Check emails" - Ajoute au début de la liste

RPUSH todolist "Prepare meeting" - Ajoute à la fin de la liste

LPOP todolist - Retire le premier élément de la liste

RPOP todolist - Retire le dernier élément de la liste

LRANGE todolist 0 -1 – Affiche les elements de la liste

Manipulation 4 : Transactions et persistances

MULTI - Débute une transaction EXEC - Exécute la transaction

INCR score:userId123 - Incrémente le score SAVE - Effectue une sauvegarde synchrone

APPEND logs "Updated score for userId123;" - Ajoute un log BGSAVE - Lance une sauvegarde asynchrone

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 80


NoSQL Document Database
Elastic Search: Introduction

Elasticsearch représente l'évolution des techniques


d'indexation de documents pour une recherche rapide basée
sur des mots-clés, expressions ou textes. Initialement, en
1876, Dewey avait introduit un système numérique pour
indexer les livres dans les bibliothèques, amélioré plus tard
par Online Computer Library Center l'OCLC. Ce système
attribue un code numérique à chaque livre pour regrouper
les ouvrages par thèmes. Cependant, avec l'avènement
d'internet, cette méthode s'est révélée insuffisante face à la
nécessité d'une indexation plus complexe pour divers types
de documents.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 81
NoSQL Document Database
Elastic Search: Apache Lucene

Elasticsearch s'appuie sur Apache Lucene, une API Java open


source pour l'indexation de documents. L'index créé
représente 20 à 30 % de la taille des documents originaux,
permettant des recherches variées et classant les résultats
par pertinence. Lucene nécessite de la programmation pour
configurer l'indexation, comme la personnalisation de la
segmentation des mots et l'exclusion de certains mots.
Lucene évolue rapidement, avec des versions fréquentes1
ajoutant ou supprimant des fonctionnalités.
1
Version 7.7.0 mi-février 2019, 7.7.1 début mars et 8.0.0 mi-mars.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 82
NoSQL Document Database
Elastic Search: Apache Lucene (Exemple)

Voici un petit programme Java qui illustre Lucene, le projet complet


est dans:

// dossier pour stocker l'index


Directory index = [Link]([Link]("[Link]"));

// analyseur de document, ici, c'est celui de base :


StandardAnalyzer analyzer = new StandardAnalyzer();

// créer un Writer d'index


IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(index, config);

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 83


NoSQL Document Database
Elastic Search: Apache Lucene (Exemple – Suite 1)

On continue avec l’ajout d’un document (à mettre dans une


méthode pour insérer de nombreux documents similaires) :

// document
Document d1 = new Document();

// champs
[Link](new TextField("titre", "Elasticsearch", [Link])) ;
[Link](new StringField("isbn", "978-1449358500", [Link]));
[Link](new IntPoint("pages", 786));

// enregistrement dans l'index


[Link](d1);
// fermeture de l'écrivain
[Link]();
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 84
NoSQL Document Database
Elastic Search: Apache Lucene (Exemple – Suite 2)

Ensuite, on crée une requête de recherche :


// construction d'une requête à l'aide d'un "assistant"
[Link] builder = new [Link]();

// le titre doit de préférence contenir "search"


Query query1 = new TermQuery(new Term("title", "search"));
[Link](query1, [Link]);

// le nombre de pages doit être entre 150 et 400 inclus


Query query2 = [Link]("pages", 150, 400);
[Link](query2, [Link]);

// requête prête à être exécutée


BooleanQuery query = [Link]();

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 85


NoSQL Document Database
Elastic Search: Apache Lucene (Exemple – Suite 2)

Enfin, on lance la recherche :


// lancement de la recherche, 10 résultats au max IndexReader
reader = [Link](index); IndexSearcher searcher =
new IndexSearcher(reader);
TopScoreDocCollector collector=[Link](10);
[Link](query, collector);

// affichage
for (ScoreDoc hit : [Link]().scoreDocs) { Document doc
= [Link]([Link]);
[Link]([Link]("isbn")+" "+[Link]("title"));
}

// fermeture
[Link]();
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 86
NoSQL Document Database
Elastic Search: Integration d’Apache Lucene

Elasticsearch (ES) intègre Lucene pour effectuer l’indexation et la


recherche, mais au lieu d’obliger à programmer en Java, il offre une
interface REST plus souple.
ES est distribué de manière transparente et extensible (scalable) sur
un groupe de machines (cluster).
Enfin, ES est accompagné de nombreux outils pour exploiter toutes
sortes de données :
analyse de données, graphiques
apprentissage automatique (machine learning)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 87


NoSQL Document Database
Elastic Search: Go Back vers REST

Une interface REST (Representational State Transfer) consiste


en un serveur HTTP couplé à une base de données :
L’URL indique l’adresse de la donnée concernée, appelée
end-point. Par exemple [Link]
[Link]
L’action : lorsqu’on construit une requête HTTP, on
indique une « méthode » parmi : GET, POST, PUT, DELETE.
GET sert à lire une information, POST à en créer, PUT à
modifier et DELETE à supprimer une information.
Les paramètres sont encodés en JSON dans la « charge
utile ». Le code d’état indique le succès de l’action : 200
ok, 201 créé, 202 modifié, 404 non trouvé, 409 en double. . .
Un service Web conforme à cette norme est appelé RESTful.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 88
NoSQL Document Database
Elastic Search: Usage de REST

Le problème est de construire des requêtes HTTP avec un


URL, une méthode et un contenu. Ce n’est pas commode :
Avec une extension pour Firefox : RESTclient, mais bug ?
En ligne de commande :
curl [-X méthode] url [-d contenu]
Exemples :
curl -X PUT [Link] -d Kiwi curl -X
DELETE [Link]
Par programme Python :
import requests
[Link]("[Link]
json={"id": "9000", "type": "fruit", "nom": "Pomme"})
[Link]("[Link] "Kiwi")
[Link]("[Link]
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 89
NoSQL Document Database
Elastic Search: Usage SHELL

Dans la suite du cours, on va faire de nombreuses


références au serveur REST. Pour que ça soit plus
pratique, on définit une variable shell :
SERVEUR='[Link]

Ainsi, on pourra faire


:curl -X GET "$SERVEUR/arbres/arbre/1"

Et on définit aussi un alias curljson comme ceci :


alias curljson='curl -H "Content-Type: application/json"'

Cet alias facilite l’envoi de documents JSON qui sont au cœur


de ES, voir plus loin.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 90


NoSQL Document Database
Elastic Search: Modèle de données

Docs ID Content
1 Content1
2 Content2
3 Content3

Keywords Term ID Keywords Docs


Keyword1 1 Keyword1 1,2
Keyword2 2 Keyword2 2
Keyword3 3 Keyword3 2,3

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 91


NoSQL Document Database
Elastic Search: Exemple d’index inversé Lucene

Doc ID Docs TermId Term Terms Docs


1 To be or not to be 1 be 1 1:2[2,6], 2:1[1], 3:1[3]
2 To be right 2 left 2 3:1[4]
3 Not to be left 3 not 3 1:1[4], 3:1[1]
4 or 4 1:1[3]
5 right 5 2:1[3]
6 to 6 [Link][1,5], [Link][2], [Link][3]

Query terms
to, do, right

Term TermId Docs from index


do na na
to 1 [Link][1,5], [Link][2], [Link][3]
right 5 [Link][3]

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 92


NoSQL Document Database
Elastic Search: Mécanismes internes

En quelques mots :
Elasticsearch est installé sur un cluster de machines appelées
nodes.
Les index regroupent des documents structurés en types.
Quand un index est trop grand pour tenir sur un seul node, il
est découpé en morceaux appelés shards (éclats).
On peut également configurer ES pour répliquer les shards sur
plusieurs machines.
De cette manière, les recherches sont distribuées, et donc très
rapides même sur du Big Data.
NB: la notion de type est en cours de disparition. Il n’y a déjà qu’un
seul type par index, et dans la version 7, les types auront disparu.

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 93


NoSQL Document Database
Elastic Search: Notations JSON

Les documents sont représentés en JSON (format


concurrent de XML). Voici l’exemple de l’un des arbres de
la region de Souss-Massa:
{
"geopoint": {
"lat": 30.427755,
"lon": -9.598107
},
"region": "Souss-Massa",
"genre": "Argania",
"espece": "spinosa",
"famille": "Sapotaceae",
"annee": 1980,
"hauteur": 10
}
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 94
NoSQL Document Database
Elastic Search: Stockage de données

Un tel document est placé sur ES par une requête PUT :


curljson -X PUT "$SERVEUR/arbres/arbre/1" -d '{
"geopoint": "lat": 30.427755, "lon": -9.598107 },
...
}'

L’URL $SERVEUR/arbres/arbre/1 indique le serveur ES, l’index


concerné, le type et enfin l’identifiant du document.
L’index arbres est créé s’il n’existe pas. Un second PUT sur
le même identifiant écrase le précédent (mise à jour).
Le schéma de la table (du type arbre) est déterminé
automatiquement en fonction des données ou préparé à
l’avance, voir un peu plus loin.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 95
NoSQL Document Database
Elastic Search: Stockage de données (Suite)

Dans le cas, préférable, où les données JSON sont dans un


fichier, employer l’une des deux commandes :
curljson -X PUT "$SERVEUR/..." -d @[Link]

cat [Link] | curljson -X PUT "$SERVEUR/..." -d @-

L’alias curljson permet d’ajouter l’entête Content-Type


indiquant que c’est du JSON.
L’option -d @- de curl fait lire les données sur sdtin.

Cependant, il est rare d’avoir un seul document dans un


fichier. Le transparent suivant montre comment insérer de
nombreux documents d’un seul coup.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 96
NoSQL Document Database
Elastic Search: Insertions en masse

Le principe est d’insérer plusieurs documents ensemble par une seule


requête POST. Ces documents sont mis dans un seul fichier (ou tube
Unix), avec une alternance de deux types de lignes :
{"index":{"_index":"INDEX","_type":"TYPE","_id":"ID"}}\n
{"champ1":"valeur1", "champ2":"valeur2", ... }\n

Les lignes impaires indiquent quel index, quel type et quel document
affecter ; les lignes paires fournissent le contenu du document.
Ensuite, on transfère ce fichier par :
curl -H "Content-Type: application/x-ndjson" \
-XPOST "$SERVEUR/_bulk" --data-binary @[Link]

Le type MIME est x-ndjson, pas json, car c’est du newline delimited
JSON : NDJSON. D’autre part, on poste sur /_bulk.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 97
NoSQL Document Database
Elastic Search: Schéma de données

Lors de l’ajout du premier document, Elasticsearch déduit les


types des champs de manière automatique, mais pas forcément
correcte. Il est souvent nécessaire de définir le schéma
manuellement avant toute insertion de données.
Dans le vocabulaire ES, on ne parle pas de schéma mais de
mappings associés à un type. Ne pas confondre ce type qui
représente une collection de documents, avec les types des
champs.
ES gère de nombreux types de champs :
Texte : text ou keyword
Numériques : long, integer, double, float. . .
Divers : boolean, date, geo_point, ip, tableau, objet JSON.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 98
NoSQL Document Database
Elastic Search: Définition Schéma de données

Pour définir les types des champs (mappings) d’un index et d’un type,
il faut émettre une requête PUT contenant la définition :
curljson -X PUT "$SERVEUR/INDEX?include_type_name=true" -d "mappings": { '{
"TYPE": {
"properties": {
"CHAMP1": { "type": "TYPE1" },
"CHAMP2": { "type": "TYPE2" },
...
}
}
}
}
L’option include_type_name prépare à la prochaine disparition
des types (version 7 de ES).
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 99
NoSQL Document Database
Elastic Search: Définition Schéma de données (Imbriqué)

Certains champs peuvent être complexes. On met "properties"


au lieu de "type" pour les définir :
"TYPE": {
"properties": {
"CHAMP1": { "type": "TYPE1" }, "CHAMP2": {
"properties": {
"CHAMP2_1": { "type": "TYPE2_1" },
"CHAMP2_2": { "type": "TYPE2_2" },
...
}
},
...

On y accède avec la notation: CHAMP2.CHAMP2_1


3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 100
NoSQL Document Database
Elastic Search: Définition Schéma de données (Imbriqué) Exemple

Voici les mappings du type arbre de l’index arbres :


"arbre": {
"properties": {
"geopoint": {
"lat": "float", // Latitude in decimal degrees
"lon": "float" // Longitude in decimal degrees
},
"region": "string", // Name of the region
"genre": "string", // Genus of the tree
"espece": "string", // Species of the tree
"famille": "string", // Family of the tree
"annee": "int", // Year the tree was planted
"hauteur": "int" // Height of the tree in meters
}
}
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 101
NoSQL Document Database
Elastic Search: Types text et keyword

Ces deux types sont destinés à contenir des chaînes de


caractères. Ils diffèrent dans la manière où le texte est
indexé.
Un champ text sert à contenir un texte quelconque qui est
découpé en mots, dont chacun est indexé (index inversé),
ce qui permet de faire des recherches sur des extraits de
ce texte. Un champ keyword est pour une chaîne qui est
mémorisée en tant qu’entité unique, un mot-clé. Il est
impossible de faire une recherche sur des extraits, on ne
peut chercher que sur la totalité du mot-clé.
On utilisera text pour un texte quelconque, et keyword pour
une chaîne identifiante (adresse mail, n° de téléphone, etc.)

3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 102


NoSQL Document Database
Elastic Search: Comment choisir text ou keyword

Cela pose un dilemme pour certains champs. Soit par


exemple, le nom commun d’un arbre. On rencontre «
Séquoia géant » et « Séquoia sempervirent ».

Si on définit ce champ en tant que keyword, on ne pourra pas


chercher les arbres dont le nom commun contient « géant ».
On ne pourra le faire que si on le définit en tant que text.

Par contre, en tant que text, on ne pourra pas chercher la


chaîne exacte « Séquoia géant », ES proposera aussi les
autres séquoias et arbres géants. Cependant il leur donnera
un score plus faible.
3/6/2024 BD2C - University of Hassan II - Noussair FIKRI 103
NoSQL Document Database
Elastic Search: Solution pour bénéficier de text et keyword

Pour résoudre le dilemme précédent, Elasticsearch


propose d’associer plusieurs types au même champ (multi-
fields), voir la documentation.
"CHAMP": {
"type": "text",
"fields": {
"SOUS-NOM": { "type": "keyword" }
}
},
...

Le champ peut être accédé en tant que text par son nom et
en tant que keyword par la notation pointée [Link]-NOM.
En général, on met "raw", ou "keyword" à la place de "SOUS-
3/6/2024
NOM". BD2C - University of Hassan II - Noussair FIKRI 104
NoSQL Document Database
Elastic Search: Optimisation de la recherche avec analyzer

Lorsqu’on ajoute un document, ses champs de type text sont


découpés en mots et chaque mot est placé dans un index
inversé, afin de retrouver instantanément les documents qui
contiennent tel ou tel mot.
Déjà, les mots sont tous mis en minuscules. Mais chaque
langue a ses spécificités concernant le découpage des mots et
l’indexation de leurs variations (cheval = chevaux, etc.). Pour
le français, on peut aider Elasticsearch à mieux indexer les
mots en rajoutant un analyzer à la définition des champs text :
"CHAMP": {
"type": "text",
"analyzer": "french"
},
3/6/2024
... BD2C - University of Hassan II - Noussair FIKRI 105

Vous aimerez peut-être aussi