Elasticsearch est un moteur de recherche, ton moteur de recherche open-source. Il permet d’effectuer des recherches presque instantanées même si la quantité de données est extrême.
Les données sont stockées dans des index qui correspondent plus au moins à des sortes de bases de données. Pour rechercher tes données, Elasticsearch va réaliser une recherche full-text, ce qui permet d’obtenir des résultats approximatifs ce qui est un avantage lorsque tu souhaiteras faire des recherches étendues.
Techniquement il est basé sur le logiciel libre Apache Lucene et il fonctionne en mode cluster (composé de plusieurs serveurs). Les recherches et l’intégration des données se font via son API et il renvoi les données au format JSON.
Installer Elasticsearch
Installer avec Docker
On commence par télécharger l’image :
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
On construit le conteneur en mappant les ports 9200 et 9300 sur notre host
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.10.1
-e « discovery.type=single-node » sert à utiliser l’outil avec un seul nœud (pour un environnement de dev).
Et on lance le conteneur :
docker start elasticsearch
Installation sur Debian
On commence par installer Java, car Elasticsearch fonctionne avec du JAVA:
sudo apt install default-jdk
On ajoute ensuite le dêpot officiel de l’outil car il n’est pas sur le dépôt par défaut de debian :
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo sh -c 'echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list'
Puis on l’installe via :
sudo apt update
sudo apt install elasticsearch
Pour finir, on lance le service :
service elasticsearch start
Installation sur Ubuntu
sudo apt install elasticsearch
service elasticsearch start
Pour tester notre outil on peux lancer un curl :
curl http://localhost:9200
Si il te renvoi une réponse qui ressemble à ceci, alors l’installation et le lancement du service est fonctionnel :
{
"name" : "debian-cours",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "QXGsP9i6RmGTmMB-ANuQIA",
"version" : {
"number" : "7.10.1",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
"build_date" : "2020-12-05T01:00:33.671820Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
Requêtes HTTP
Pour manipuler Elasticsearch nous allons utiliser les requêtes ci-dessous qui exécuteront des actions sur nos index :
- GET = pour afficher/récupérer des données
- POST = pour ajouter ou modifier nos données
- DELETE = Pour supprimer nos données ou index
Créer son premier index
Pour créer notre premier index on va effectuer une requête POST qui va contenir les data à ajouter dans notre index.
Pour cela on va créer un fichier insert_data qui va contenir nos données :
{ "create" : { "_index" : "Jeu", "_type" : "Personnages", "_id": 1 } }
{"nom": "Mario", "univers": "Nintendo", "ville" : "Rome"}
{ "create" : { "_index" : "Jeu", "_type" : "Personnages", "_id": 2 } }
{"nom": "Sonic", "univers": "Sega", "ville" : "Tokyo"}
{ "create" : { "_index" : "Jeu", "_type" : "Personnages", "_id": 3 } }
{"nom": "Rayman", "univers": "Ubisoft", "ville" : "Montpellier"}'
Avant chaque ajout de données nous avons la ligne :
{ "create" : { "_index" : "Jeu", "_type" : "Personnages", "_id": 1 } }
qui permet l’insertion de la ligne suivante. Cette ligne sert à indiquer où le logiciel doit insérer les données de la ligne suivant.
_index = notre index (logique 🤐)
_type = correspond à une table
_id = identifiant de la donnée
Puis juste en dessous nous avons la donnée avec ses différent champs à importer:
{"nom": "Mario", "univers": "Nintendo", "ville" : "Rome"}
Ici nous avons importé une donnée qui a pour nom Mario, univers Nintendo et ville Rome, on sait aussi que son index est Jeu, son type est Personnages et son id est 1.
On a donc un alternement entre ‘{ « create » : { « _index …’ et la donnée à ajouter {« nom »: « Rayman », « univers »: « Ubisoft », « ville » : « Montpellier »}.
Donc pour intégrer les données du fichier insert_data, nous allons utiliser cette commande curl :
curl -H "Content-Type: application/json" -XPOST http://localhost:9200/_bulk --data-binary @insert_data
-H « Content-Type: application/json » : le type de l’entête de la requête (sans celle-ci ta requête générera sûrement une erreur)
-XPOST : pour ajouter des données on utilise une requête POST
_bulk : la fonction qui permet d’ajouter en masses des données.
–data-binary @insert_data : pour intégrer notre fichier de données
On reçoit alors une réponse au status code 201 qui signifie que l’ajout est un succés.
Si l’on se rend sur http://localhost:9200/jeu/personnages/1 on peut voir les données sur Mario :
{"_index":"jeu","_type":"personnages","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"nom": "Mario", "univers": "Nintendo", "ville" : "Rome"}}
J’ai ajouté des données via curl mais on peut également utiliser Python pour interagir avec nos bases. Par exemple, pour importer ces données en Python :
import requests
url = "http://localhost:9200/_bulk"
header = {"Content-Type":"application/json"}
# Data récupère le contenu du fichier :
data = open("insert_data", "rb")
data = data.read()
# On POST ces données dans une requête:
response = requests.post(url,headers=header,data=data)
print(response.status_code)
print(response.content)
Supprimer des données
Pour supprimer un index, il suffit d’effectuer un curl DELETE sur le chemin de notre index.
Si je veux supprimer mon index jeu, il me suffit de faire :
curl -XDELETE http://localhost:9200/jeu
On peut faire la même chose pour supprimer une donnée via son ID, exemple :
curl -XDELETE http://localhost:9200/jeu/personnages/3
et Idem pour une table :
curl -XDELETE http://localhost:9200/jeu/personnages
Tu sais maintenant comment installer elasticsearch, créer des index, importer des données en supprimer et tout cela via des requêtes HTTP.
Si tu veux en savoir plus voici la doc officielle.
Ping : Ajouter données en masse sur Elasticsearch avec Python - Linux-Man
Ping : Kibana - Installation en 1 minutes avec Docker/Ubuntu/Debian/Centos - Linux-Man
Ping : Visualiser ses logs dans Kibana avec Filebeat - Syslog et Apache - Linux-Man