Client Elasticsearch pour PHP : elasticsearch-php — guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Client Elasticsearch pour PHP (elasticsearch-php) : un outil puissant pour la recherche et l'analyse

\n\n

Elasticsearch est un système de recherche et d'analyse distribué, construit sur Apache Lucene. Il permet de stocker, rechercher et analyser de grands volumes de données en quasi temps réel. Pour interagir avec Elasticsearch depuis des applications PHP, il existe un client officiel : elasticsearch-php. Cette bibliothèque fournit une API pratique pour effectuer toutes les opérations : de l'indexation de documents aux requêtes de recherche complexes et aux agrégations.

\n\n

Dans cet article, nous allons détailler l'installation, la configuration et les principales fonctionnalités d'elasticsearch-php. Vous apprendrez à vous connecter à un cluster, créer un index, ajouter des documents, effectuer une recherche et utiliser des fonctions avancées telles que le filtrage et l'agrégation de données.

\n\n

Installation d'elasticsearch-php

\n\n

La bibliothèque est distribuée via Composer. Pour l'installer, exécutez la commande suivante à la racine de votre projet :

\n\n
composer require elasticsearch/elasticsearch
\n\n

Après l'installation, une dépendance apparaîtra dans le fichier composer.json. Assurez-vous d'avoir PHP version 7.4 ou supérieure, ainsi que l'extension json.

\n\n

Connexion au serveur Elasticsearch

\n\n

La première étape consiste à créer un client. Pour un serveur local (par défaut, Elasticsearch écoute sur le port 9200), le code ressemblera à ceci :

\n\n
<?php\nrequire 'vendor/autoload.php';\n\nuse Elastic\\Elasticsearch\\ClientBuilder;\n\n$client = ClientBuilder::create()\n    ->setHosts(['localhost:9200'])\n    ->build();\n?>
\n\n

Si votre serveur nécessite une authentification (par exemple, via un nom d'utilisateur/mot de passe ou une clé API), transmettez les paramètres :

\n\n
$client = ClientBuilder::create()\n    ->setHosts(['https://user:pass@localhost:9200'])\n    ->setSSLVerification(false) // uniquement pour le développement\n    ->build();
\n\n

Travailler avec les index et les documents

\n\n

Elasticsearch stocke les données dans des index (analogues aux tables en SQL). Créons un index products avec un mapping simple :

\n\n
$params = [\n    'index' => 'products',\n    'body' => [\n        'settings' => [\n            'number_of_shards' => 1,\n            'number_of_replicas' => 0\n        ],\n        'mappings' => [\n            'properties' => [\n                'title' => ['type' => 'text'],\n                'price' => ['type' => 'float'],\n                'description' => ['type' => 'text'],\n                'category' => ['type' => 'keyword']\n            ]\n        ]\n    ]\n];\n\n$response = $client->indices()->create($params);
\n\n

Ajoutons maintenant quelques documents :

\n\n
$documents = [\n    ['title' => 'Ordinateur portable Dell XPS 15', 'price' => 1200.00, 'description' => 'Ultrabook puissant pour le travail', 'category' => 'electronics'],\n    ['title' => 'Livre "PHP pour les professionnels"', 'price' => 45.50, 'description' => 'Apprentissage de PHP à un niveau avancé', 'category' => 'books'],\n    ['title' => 'Casque Sony WH-1000XM5', 'price' => 350.00, 'description' => 'Casque sans fil avec réduction de bruit', 'category' => 'electronics']\n];\n\nforeach ($documents as $id => $doc) {\n    $params = [\n        'index' => 'products',\n        'id' => $id + 1,\n        'body' => $doc\n    ];\n    $response = $client->index($params);\n}
\n\n

Recherche de documents

\n\n

Effectuons une recherche en texte intégral dans le champ title :

\n\n
$params = [\n    'index' => 'products',\n    'body' => [\n        'query' => [\n            'match' => [\n                'title' => 'ordinateur portable'\n            ]\n        ]\n    ]\n];\n\n$response = $client->search($params);\n$hits = $response['hits']['hits'];\n\nforeach ($hits as $hit) {\n    echo "ID: " . $hit['_id'] . " | Titre: " . $hit['_source']['title'] . " | Prix: " . $hit['_source']['price'] . "\n";\n}

Recommendations