Développement Web Elasticsearch PHP Recherche

Elasticsearch : moteur de recherche full-text pour PHP

Implémentez elasticsearch avec PHP : indexation, recherche full-text, agrégations, filtres et suggestions. Guide complet avec exemples pratiques.

Benjamin Schweitzer Benjamin Schweitzer
Lundi 21 avril 2025
4 min de lecture
Elasticsearch : moteur de recherche full-text pour PHP

Elasticsearch est le moteur de recherche distribué le plus utilisé au monde. Basé sur Apache Lucene, il permet des recherches full-text ultra-rapides sur des milliards de documents. Pour les sites avec un volume important de contenu, elasticsearch offre des capacités de recherche bien supérieures aux recherches SQL LIKE.

Quand utiliser Elasticsearch ?

MySQL LIKE '%motclé%' est lent (full table scan), ne comprend pas les synonymes, ne gère pas les fautes de frappe et ne trie pas par pertinence. elasticsearch résout tous ces problèmes avec des performances constantes quelle que soit la volumétrie.

Cas d'usage typiques : moteur de recherche de site e-commerce, recherche dans des articles de blog, logs et analytics, recherche de données métier.

Installation avec Docker

docker run -d --name elasticsearch   -p 9200:9200   -e "discovery.type=single-node"   -e "ES_JAVA_OPTS=-Xms512m -Xmx512m"   docker.elastic.co/elasticsearch/elasticsearch:8.12.0

Client PHP Elasticsearch

composer require elasticsearch/elasticsearch

use Elastic\Elasticsearch\ClientBuilder;

$client = ClientBuilder::create()
    ->setHosts(['localhost:9200'])
    ->build();

Créer un index et indexer des documents

// Créer l'index avec le mapping
$client->indices()->create([
    'index' => 'articles',
    'body' => [
        'mappings' => [
            'properties' => [
                'titre' => ['type' => 'text', 'analyzer' => 'french'],
                'contenu' => ['type' => 'text', 'analyzer' => 'french'],
                'slug' => ['type' => 'keyword'],
                'statut' => ['type' => 'keyword'],
                'created_at' => ['type' => 'date'],
                'tags' => ['type' => 'keyword'],
            ]
        ]
    ]
]);

// Indexer un article
$client->index([
    'index' => 'articles',
    'id' => $article['slug'],
    'body' => [
        'titre' => $article['titre'],
        'contenu' => strip_tags($article['html_content']),
        'slug' => $article['slug'],
        'statut' => $article['statut'],
        'created_at' => $article['published_at'],
        'tags' => $article['tags'],
    ]
]);

Recherche full-text

$results = $client->search([
    'index' => 'articles',
    'body' => [
        'query' => [
            'bool' => [
                'must' => [
                    'multi_match' => [
                        'query' => $searchQuery,
                        'fields' => ['titre^3', 'contenu'],  // titre plus important
                        'fuzziness' => 'AUTO',  // tolérance aux fautes
                        'type' => 'best_fields'
                    ]
                ],
                'filter' => [
                    ['term' => ['statut' => 'publié']]
                ]
            ]
        ],
        'highlight' => [
            'fields' => ['titre' => [], 'contenu' => ['fragment_size' => 200]]
        ],
        'size' => 10
    ]
]);

Suggestions et auto-complétion

$suggestions = $client->search([
    'index' => 'articles',
    'body' => [
        'suggest' => [
            'titre_suggest' => [
                'prefix' => $prefix,
                'completion' => ['field' => 'titre.suggest', 'size' => 5]
            ]
        ]
    ]
]);

Synchronisation avec la base de données

Indexez dans elasticsearch à chaque modification en base (hooks, events, ou via un worker qui consomme une file de messages). Pour une synchronisation initiale en masse, utilisez l'API bulk.

La documentation Elasticsearch couvre l'API PHP complète avec tous les cas d'usage avancés.

Conclusion

Elasticsearch transforme radicalement l'expérience de recherche de votre site. La mise en place initiale demande un effort, mais le gain en qualité de recherche (pertinence, rapidité, tolérance aux fautes) est immédiatement perceptible par les utilisateurs. Pour tout site avec plus de quelques milliers de contenus, elasticsearch est l'investissement le plus rentable en termes d'UX.

Elasticsearch est bien plus qu'un moteur de recherche : c'est une plateforme d'analyse de données distribuée. Configurez vos mappings avec soin : keyword pour les champs filtrés, text avec analyseurs pour la recherche full-text, et date pour les champs temporels. Les search templates permettent de sauvegarder des requêtes complexes réutilisables. En production, dimensionnez vos shards correctement (1 shard par 30-50 GB), activez les réplicas pour la haute disponibilité, et configurez des ILM policies pour archiver automatiquement les vieux index. Kibana complète Elasticsearch avec des dashboards visuels. La documentation Elastic est complète avec des exemples pour chaque type de requête avancée.

Monitoring de cluster

Surveillez la santé de votre cluster Elasticsearch avec l'API /_cluster/health : status green (tout va bien), yellow (réplicas non alloués), red (données non disponibles). Configurez des alertes sur les métriques clés : JVM heap usage (< 75%), disk usage (< 85%), et query latency. Kibana Alerting ou des règles Prometheus permettent de détecter proactivement les problèmes avant qu'ils n'affectent la production.

Cet article vous a plu ?

Donnez-lui une note, ça m'aide vraiment !

Partager l'article