Configurer elasticsearch sur un projet symfony 2

elasticsearchlogo

Elasticsearch est un moteur de recherche libre. Elasticsearch fournit toutes les fonctionnalités d'un moteur de recherche nouvelle génération : les recherches par mots-clés « à la Google », les recherches par combinaison de critères et de filtres, le tri et la pagination des résultats, la gestion des synonymes, l'extraction de texte à partir de documents binaires, l'analyse et la navigation par facettes.

Dans cet article je vais vous présenter la configuration de base du bundle FOSElasticaBundle dans un projet Symfony 2.

Mise en place du bundle

Pour pouvoir utiliser elasticsearch, il faut installer le bundle FOSElasticaBundle.

Dans ce cas, ouvrez une console de commande, entrez dans votre répertoire de projet et exécutez la commande suivante pour télécharger sa dernière version stable:

$ php composer.phar require "friendsofsymfony/elastica-bundle"

Ensuite, activez le bundle en ajoutant les lignes suivantes dans le fichier app/AppKernel.php de votre projet:

<?php

// app/AppKernel.php

// ...

class AppKernel extends Kernel

{

    public function registerBundles()

    {

        $bundles = array(

            // ...

            new FOS\ElasticaBundle\FOSElasticaBundle(),

        );

        // ...

    }

}

Terminologie

Avant de commencer la configuration, il est important de faire un point sur la terminologie utilisée. Nous allons donc faire une analogie avec la structure des bases de données relationnelles.

  • Clients : Définit les clients disponibles pour la recherche.
  • Index : Représente le nom de l’index dans Elasticsearch. On peut l’apparenter au nom de notre base de données. Il va regrouper des types de document au même titre qu’une base de données regroupe des tables.
  • Types : Déclare les différents types de documents qui seront indexés. Nous n’aurons dans cet exemple qu’un seul type : l’article. Un type peut être apparenté à une table de base de données. Chaque type contient une liste des champs disponibles pour les documents.
  • Les documents sont comme les lignes dans une base des données relationnelle. Ces documents sont stockés au format JSON et ont un index, un type et un id en plus des données.
  • Mapping : Déclaration des valeurs présentes sur le document. Cela peut être assimilé à un champ de base de données SQL. Le mapping peut être définit manuellement, mais aussi généré automatiquement quand les documents sont indexés.
  • Persistence : Définit la manière dont FOSElasticaBundle va indexer vos documents en fonction de vos entités Symfony.
  • Listener : Liste les listeners pour lesquels l’indexation intervient. (Par défaut : insert, update, delete)
  • Provider : Interface d’indexation. Service permettant de définir la manière d’indexer dans Elasticsearch
  • Finder : Interface de recherche. Service permettant de lancer une recherche vers Elasticsearch
  • Model : Permet de définir un document Elasticsearch à partir d’une entité symfony. C’est la manière la plus simple d’indexer les documents : en utilisant les modèles déjà définis pour votre application.
  • Driver : Driver à utiliser (orm, mongodb, propel)

 Configuration de base du fichier de mapping

Pour l’indexation des documents, il est nécessaire de déclarer le format de vos documents. Le nom des champs, leur type, et les filtres appliqués à l’indexation et à la recherche.

Dans le fichier config.yml, ajoutez l’import d’un fichier fos_elastica.yml qui contiendra toute la configuration.

#app/config/config.yml
imports :
    - { resource: fos_elastica.yml }

La configuration minimale de base pour FOSElasticaBundle est un client avec un index ElasticSearch.

#app/config/fos_elastica.yml
fos_elastica:
    clients:
        default: { host: localhost , port: 9200 }
    indexes :
        website:
            client: default
         types:
             articles:
                 mappings:
                     id:
                         type: integer
                     createdAt:
                         type: date
                     publishedAt:
                         type: date
                     published:
                         type: boolean
                     title: ~
                     content: ~
                 persistence:
                     driver: orm
                     model: Projet\demoElasticaBundle\Entity\Article
                     finder: ~
                     provider: ~
                     listener: ~

Dans cet exemple de configuration, un index Elastica (une instance de Elastica\Index) est disponible en tant que service avec la clé fos_elastica.index.website

Remplir l'index ElasticSearch

Lorsque vous utilisez le provider et le listener, tout objet nouveau ou modifié sera indexé automatiquement. Dans certains cas, lorsque la base de données est modifiée à l'extérieur, l'index Elasticsearch doit être mis à jour manuellement. Ceci peut être réalisé en exécutant la commande de la console:

$ php app/console fos:elastica:populate

Cette commande permet d’indexer toutes les données dans la base de données;  celle-ci utilise le provider, et boucle sur tous vos objets doctrine présents en base pour remplir l’index. Pour chaque entrée définie dans le mapping lors du paramétrage (fos_elastica.yml) le getter sera appelé et la valeur retournée, insérée côté Elasticsearch.

Cette commande permettra également de créer tous les index et les types définis si ils ne sont pas déjà sur le serveur ElasticSearch.

Effectuer des recherches dans votre application

// get finder object first for our index
$finder = $this->container->get('fos_elastica.index.website');
// find with exact phrase "demo elasticsearch" in title or content
$articles = $finder->find("demo elasticsearch");
// find articles with "like" query
$keywordQuery = new QueryString();
$keywordQuery->setQuery("*demo elasticsearch*");

$query = new Query();
$query->setQuery($keywordQuery);

$articles = $finder->find($query);

Comme la configuration ci-dessus est juste une configuration de base, bien sûr il y a d'autres configurations permettant d'optimiser la recherche et d'avoir des résultats pertinents du côté utilisateur.

Un commentaire

  1. Bonjour,

    Merci pour ce magnifique article. Ce pendant puis-je avoir un site pour la documentation exhaustive sur elasticsearch dans symfony2.

    Merci beaucoup

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.