Pourquoi Python avec Elasticsearch : guide pratique ?
Python est un langage polyvalent apprécié pour sa simplicité et sa puissance. L'intégration de Python avec Elasticsearch, une plateforme de recherche en temps réel, offre des avantages significatifs :
- Efficacité : Elasticsearch est conçu pour traiter des milliards de documents en secondes.
- Facilité d'utilisation : La bibliothèque
elasticsearch-pysimplifie l'interaction avec Elasticsearch. - Flexibilité : Python permet une grande flexibilité dans le développement, ce qui facilite la création de solutions personnalisées.
Un cas d'usage concret serait la gestion d'une application de blog. Nous souhaitons stocker et récupérer des articles en temps réel, tout en facilitant les recherches et les filtres.
Prerequis
Connaissances nécessaires :
- Python (3.x)
- Connaissance de base de la programmation orientée objet
- Familiarité avec les structures de données
Outils à installer :
- Elasticsearch v7.10 ou plus tard (https://www.elastic.co/downloads/elasticsearch)
- Python v3.8 ou plus tard (https://www.python.org/downloads/)
- pip pour gérer les packages Python (vienant avec Python)
Concepts fondamentaux
1. Installation et configuration d'Elasticsearch
Commencez par installer Elasticsearch :
## Téléchargez et installez Elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.10.0-linux-x86_64.tar.gz
cd elasticsearch-7.10.0
## Lancez Elasticsearch
./bin/elasticsearch
2. Installation de la bibliothèque elasticsearch-py
Installez la bibliothèque Python pour interagir avec Elasticsearch :
pip install elasticsearch
3. Connexion à Elasticsearch
Voici comment vous pouvez vous connecter à votre instance d'Elasticsearch :
from elasticsearch import Elasticsearch
## Configurer le client Elasticsearch
es = Elasticsearch("http://localhost:9200")
## Vérifier la connexion
if es.ping():
print("Connected to Elasticsearch")
else:
print("Could not connect to Elasticsearch")
4. Indexation de documents
Indexer des documents dans Elasticsearch est simple :
from elasticsearch import Elasticsearch
## Connexion au client Elasticsearch
es = Elasticsearch("http://localhost:9200")
## Document à indexer
doc = {
"title": "Python avec Elasticsearch : guide pratique",
"content": "Ce tutoriel vous apprendra comment utiliser Python pour travailler avec Elasticsearch."
}
## Indexation du document
res = es.index(index="blog", id=1, body=doc)
print(res['result'])
5. Recherche de documents
Rechercher des documents dans Elasticsearch est également facile :
from elasticsearch import Elasticsearch
## Connexion au client Elasticsearch
es = Elasticsearch("http://localhost:9200")
## Requête de recherche
query = {
"match": {
"content": "Python avec Elasticsearch"
}
}
## Exécution de la requête
res = es.search(index="blog", body=query)
print("Found %d documents" % res['hits']['total']['value'])
for hit in res['hits']['hits']:
print(hit["_source"])
6. Mise à jour et suppression de documents
Mettre à jour et supprimer des documents est également simple :
from elasticsearch import Elasticsearch
## Connexion au client Elasticsearch
es = Elasticsearch("http://localhost:9200")
## Mise à jour d'un document
update_res = es.update(index="blog", id=1, body={"doc": {"content": "Python avec Elasticsearch : guide pratique amélioré."}})
print(update_res['result'])
## Suppression d'un document
delete_res = es.delete(index="blog", id=1)
print(delete_res['result'])
Mise en pratique : projet fil rouge
Étape 1 : Création du projet et configuration de l'environnement
Créez un nouveau répertoire pour votre projet :
mkdir blog-app
cd blog-app
pipenv install elasticsearch flask
Structure des fichiers initiale :
blog-app/
├── app.py
├── requirements.txt
└── README.md
Étape 2 : Création d'un serveur Flask
Créez un fichier app.py pour votre application Flask :
from flask import Flask, request, jsonify
from elasticsearch import Elasticsearch
app = Flask(__name__)
es = Elasticsearch("http://localhost:9200")
@app.route('/posts', methods=['POST'])
def create_post():
data = request.get_json()
res = es.index(index="blog", body=data)
return jsonify(res), 201
@app.route('/posts/<int:id>', methods=['GET'])
def get_post(id):
res = es.get(index="blog", id=id)
return jsonify(res['_source'])
@app.route('/posts', methods=['GET'])
def search_posts():
query = request.args.get('query')
body = {
"match": {
"content": query
}
}
res = es.search(index="blog", body=body)
return jsonify([hit['_source'] for hit in res['hits']['hits']])
if __name__ == '__main__':
app.run(debug=True)
Étape 3 : Indexation de documents
Ajoutez quelques documents dans Elasticsearch :
from elasticsearch import Elasticsearch
es = Elasticsearch("http://localhost:9200")
## Ajout d'un document
doc1 = {
"title": "Python avec Elasticsearch : guide pratique",
"content": "Ce tutoriel vous apprendra comment utiliser Python pour travailler avec Elasticsearch."
}
res = es.index(index="blog", id=1, body=doc1)
print(res['result'])
## Ajout d'un autre document
doc2 = {
"title": "Introduction à Flask",
"content": "Flask est un framework web Python simple et efficace."
}
res = es.index(index="blog", id=2, body=doc2)
print(res['result'])
Étape 4 : Exécution de l'application
Lancez votre application Flask :
pipenv run python app.py
Vous pouvez maintenant tester vos endpoints à travers une interface web ou des outils comme Postman.
Erreurs fréquentes et debugging
1. Connection refused
Le message d'erreur serait : elasticsearch.exceptions.ConnectionError: Connection refused.
## ❌ Mauvais
es = Elasticsearch("http://localhost:9200")
## ✅ Correct
es = Elasticsearch("http://localhost:9200", timeout=30)
2. JSONDecodeError
Le message d'erreur serait : elasticsearch.exceptions.JSONDecodeError.
## ❌ Mauvais
res = es.search(index="blog", body={"match": {"content": "Python avec Elasticsearch"}})
## ✅ Correct
from elasticsearch_dsl import Search
s = Search(using=es, index="blog")
q = s.query("match", content="Python avec Elasticsearch")
res = q.execute()
3. ElasticsearchError
Le message d'erreur serait : elasticsearch.exceptions.ElasticsearchError.
## ❌ Mauvais
doc = {"title": "Nouveau document"}
es.index(index="blog", id=1, body=doc)
## ✅ Correct
try:
es.index(index="blog", id=1, body=doc)
except Exception as e:
print(f"Error: {e}")
Pour aller plus loin
1. Utiliser Elasticsearch avec Docker
Utilisez Docker pour simplifier le déploiement et la gestion d'Elasticsearch :
2. Optimiser les performances de recherche
Apprenez à optimiser vos requêtes de recherche pour améliorer les performances :
3. Utiliser Elasticsearch pour l'analyse de données
Intégrez Elasticsearch avec d'autres outils comme Kibana et Logstash pour une analyse de données complète :
Défi pratique : Créer un CLI tool pour gérer les articles du blog
Développez un simple CLI tool qui permet de créer, lire, mettre à jour et supprimer des articles. Utilisez argparse pour la gestion des commandes :
import argparse
from elasticsearch import Elasticsearch
es = Elasticsearch("http://localhost:9200")
def create_post(title, content):
doc = {
"title": title,
"content": content
}
res = es.index(index="blog", body=doc)
print(f"Document créé avec ID {res['_id']}")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Gestion de blog via CLI')
subparsers = parser.add_subparsers(dest='command')
create_parser = subparsers.add_parser('create', help='Créer un article')
create_parser.add_argument('title', type=str, help='Titre de l'article')
create_parser.add_argument('content', type=str, help='Contenu de l'article')
args = parser.parse_args()
if args.command == 'create':
create_post(args.title, args.content)
Ce CLI tool permettra d'ajouter des articles simplement via la ligne de commande.