Elasticsearch – Installation et création de notre premier index

elasticsearch

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.

Cet article a 3 commentaires

Laisser un commentaire