Elasticsearch demeure une référence incontournable dans l'univers des moteurs de recherche plein texte (Full-Text Search). Malgré l'émergence de solutions alternatives comme Rediseach, la robustesse et la scalabilité d'Elasticsearch en font le choix privilégié pour de nombreuses architectures de données. Cet article détaille la mise en œuvre d'Elasticsearch 7 via Docker sur un environnement Windows, suivie d'une interaction programmatique en Python 3.
Déploiement d'Elasticsearch avec Docker
Pour commencer, nous récupérons l'image officielle. L'utilisation de la version 7.x est recommandée pour bénéficier des optimisations de performance significatives introduites dans cette branche.
docker pull elasticsearch:7.2.0
Une fois l'image téléchargée, nous lançons le conteneur en mode nœud unique (single-node). Nous exposons le port 9200 pour les requêtes HTTP (API REST) et le port 9300 pour la communication interne entre les nœuds du cluster.
docker run --name elasticsearch-node -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.2.0
Une vérification rapide via un navigateur à l'adresse http://localhost:9200 permet de confirmer le bon fonctionnement du service.
Personnalisation de la configuration
Pour adapter Elasticsearch à des besoins spécifiques, notamment pour autoriser les requêtes cross-origin (CORS), il est nécessaire de modifier le fichier elasticsearch.yml. La méthode la plus propre consiste à extraire le fichier par défaut du conteneur, à le modifier localement, puis à le lier lors du lancement.
Extraction du fichier de configuration :
docker cp elasticsearch-node:/usr/share/elasticsearch/config/elasticsearch.yml ./config_es.yml
Modifiez le fichier config_es.yml pour y inclure les paramètres réseau et CORS suivants :
cluster.name: "mon-cluster-docker"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
Après avoir arrêté et supprimé le conteneur existant, redémarrez-le en montant votre fichier local :
docker run --name elasticsearch-node -v /chemin/vers/config_es.yml:/usr/share/elasticsearch/config/elasticsearch.yml -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.2.0
Note pour les utilisateurs Windows : Si vous utilisez Docker Toolbox avec VirtualBox, assurez-vous de configurer correctement les dossiers partagés dans l'interface de VirtualBox pour que le montage de volume (-v) fonctionne.
Interaction avec Python 3
Pour manipuler Elasticsearch depuis un script Python, installez la bibliothèque officielle :
pip install elasticsearch
Voici comment structurer vos opérations de base (CRUD) et de recherche.
Initialisation du client et de l'index
from elasticsearch import Elasticsearch
# Connexion au serveur
es_client = Elasticsearch([{'host': 'localhost', 'port': 9200}])
# Création d'un index nommé 'publications'
if not es_client.indices.exists(index='publications'):
res = es_client.indices.create(index='publications', ignore=400)
print("Index créé :", res)
Gestion des données (Insersion et Mise à jour)
Elasticsearch traite les données sous forme de documents JSON, similaires à une base de données orientée documents.
# Insertion d'un document
doc_id = '101'
contenu_doc = {
'titre': 'Introduction à Elasticsearch',
'url': 'https://example.com/es-intro',
'description': 'Apprendre à configurer Elasticsearch sur Docker.'
}
es_client.index(index='publications', id=doc_id, body=contenu_doc)
# Mise à jour partielle du document
update_body = {
'doc': {
'description': 'Guide complet sur Elasticsearch et Docker.'
}
}
es_client.update(index='publications', id=doc_id, body=update_body)
Recherche plein texte
La puissance d'Elasticsearch réside dans son Query DSL. Voici une requête simple pour rechercher des termes spécifiques dans le champ de description.
# Requête de recherche
query_search = {
'query': {
'match': {
'description': 'Elasticsearch Docker'
}
}
}
resultats = es_client.search(index='publications', body=query_search)
for hit in resultats['hits']['hits']:
print(f"ID: {hit['_id']} - Score: {hit['_score']}")
print(f"Données: {hit['_source']}")
Contrairement aux bases de données relationnelles classiques, Elasticsearch n'est pas conçu pour remplacer un stockage transactionnel (ACID). Il excelle dans la récupération rapide de données et l'analyse textuelle grâce à son moteur d'indexation inversée. C'est un outil complémentaire idéal pour améliorer les capacités de recherche d'une application existante.