Elasticsearch avec python
Je vais te présenter un petit script qui permet de formater un fichier JSON pour l’intégrer dans un index d’Elasticsearch avec Python.
Pour l’exemple j’avais besoin d’un fichier contenant une grande quantité de data. Je me suis donc rendu sur data.gouv.fr le site du gouvernement qui met à disposition des bases de données publiques. Par pure hasard j’ai choisi la base de données des immatriculations d’entreprises de toute la France (mauvais choix 😅) et je l’ai téléchargé au format JSON.
Donc on a un fichier JSON contenant plus de 900 lignes et ressemblant à ça :
{"datasetid": "statistiques-immatriculations-en-2020", "recordid": "c7906f63a26cf5e068bc064be27440a4aae78d5c", "fields": {"mois_annee": "1/2020", "groupements_d_interet_economique": 1, "societes_commerciales_sur_achats": 9, "periode": "2020-01", "mois": 1, "code_region": 75, "libelle_departement": "LOT ET GARONNE", "greffe": "AGEN", "region": "Nouvelle Aquitaine (Aquitaine-Limousin-Poitou-Charentes)", "societes_commerciales_sur_autres_origines": 0, "personnes_physiques": 94, "periode_mois": "2020-01-01", "datetmp": "2020/1", "societes_commerciales_sur_creation": 55, "code_libelle_departement": "047 - 047 - LOT ET GARONNE", "geolocalisation": [44.20079, 0.618539], "code_departement": "047", "annee": 2020, "total": 215, "departement": "047 - LOT ET GARONNE", "societes_civiles": 56}, "geometry": {"type": "Point", "coordinates": [0.618539, 44.20079]}, "record_timestamp": "2020-09-02T14:35:00+02:00"}
C’est juste la première ligne il y en a encore 900 derrière.
Pour ajouter des données dans elasticsearch chaque ligne doit être précédé d’une ligne de ce type :
{ "create" : { "_index" : "immatriculation", "_type" : "entreprises", "_id": 0} }
On doit donc ajouter cette ligne avant chacune des lignes de notre JSON et en incrémentant _id.
Pour ce faire voici un petit script python qui formatera notre fichier JSON pour pouvoir ensuite l’importer dans Elasticsearch avec Python :
data = open('immatriculation.json','r')
data_new = open('immatriculation_formater.json','w')
data_ligne = data.readlines()
e = 0
for i in data_ligne:
data_new.write('{ "create" : { "_index" : "immatriculation", "_type" : "entreprises", "_id": '+ str(e) +'} }\n')
data_new.write(i)
e += 1
data.close()
data_new.close()
Ce script créée donc un nouveau fichier JSON avec { « create » : { « _index » : « immat », « _type » : « entreprises », « _id »: 0} } avant chaque ligne (avec l’id incrémenté).
On peut ensuite intégrer nos données avec un bulk :
Intégrer le fichier JSON vers notre index Elasticsearch avec Python :
import requests
url = "http://localhost:9200/_bulk"
header = {"Content-Type":"application/json"}
# Data récupère le contenu du fichier json :
data = open("immatriculation_formater.json", "rb")
data = data.read()
# On crée les data sur notre serveur elasticsearch :
response = requests.post(url,headers=header,data=data)
print(response.status_code)
print(response.content)
Avec curl :
curl -H "Content-Type: application/json" -XPOST http://localhost:9200/_bulk --data-binary @immatriculation_formater.json
Toutes nos données ont été ajouté à l’index « immatriculation » sur la table « entreprises »
Si tu as besoin d’apprendre à installer et manipuler Elasticsearch voici le cours d’introduction.
Ping : Recherche Elasticsearch - Devops - Linux-Man