[Solr 4.7 avancé]: Intégration avec Symfony 2


Deux articles précédent ce nouvel article:
Un premier [Solr 4.7] : Installation, Configuration , Manipulation pour faire les premiers pas avec Solr 4.7; installation de Solr, déploiement sur Tomcat 7 ou avec Jetty, simples requêtes de sélection pour tester le bon fonctionnement.
Puis un autre article plus avancé, [solr 4.7 avancé]: Indexation consacré pour l’indexation avec Solr et la description de ses fichiers de configuration.


Pour ce nouveau poste, on va pouvoir communiquer entre une application Symfony 2 avec Solr et ainsi manipuler.
Pour aboutir, on utilisera un bundle NelmioSolarium, on mettra un service à l’aide de Dependency Injection, les résultats seront présentés avec un bundle KnpPaginator permettant de partager ces résultats sur plusieurs pages.
On suppose avoir indexé nos documents provenant de notre base (mysql pour notre exemple).
Si ce n’est pas le cas, vous pouvez trouver votre bonheur dans l’article précédent.


Solarium:


Solarium est une librairie cliente libre Solr, pour les  applications PHP.

Pour suivre les caractéristiques incluses, voir Solarium features

Simple requête de sélection avec Solarium :

// include solarium library

$client = $this->get('solarium.client');

$select = $client->createSelect();

$select->setQuery(*:*);
$results = $client->select($select);
on peut utiliser $results dans un foreach pour afficher les resultats de la requête.

NelmioSolariumBundle:
Pour integrer le client Solr (Solarium) avec Symfony2, on utilisera le bundle NelmioSolarium, libre aussi, trouvé sur github : Github - NelmioSolariumBundle

app/AppKernel.php
$bundles = array(
// created bundle name
new Blogger\BlogBundle\BloggerBlogBundle(),
// solarium
new Nelmio\SolariumBundle\NelmioSolariumBundle(),
//Paginator
new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
);

BloggerBlogBundle est le nom du bundle créé pour notre application.
NelmioSolariumBundle désigne la librairie Solr à integrer.
KnpPaginatorBundle est un outil qui permet de mettre en disposition un paginateur lors de l’affichage du résultat de la requête.

app/config/config.yml
imports:
   ...
   - { resource: tiers/nelmio_solarium.yml }


app/config/parameter.yml
parameters:
   database_driver: pdo_mysql
   database_host: 127.0.0.1
   database_port: null
   database_name: restofraisweb
   database_user: root
   database_password: root
   mailer_transport: smtp
   mailer_host: 127.0.0.1
   mailer_user: null
   mailer_password: null
   locale: fr
   secret: ThisTokenIsNotSoSecretChangeIt
   nelmio_solarium_host : 127.0.0.1
   nelmio_solarium_port : 8080
   nelmio_solarium_path : /restofraisweb


/src/Blogger/BlogBundle/Resources/config/services.xml


on déclare sorium en tant que service.
services.xml sera prit en compte avec les fichiers de config, et sera chargé par  
BloggerBlogExtension.php


<?xml version="1.0" ?>

<container ...>
   <services>
       <!-- Search Engine Manager-->
<service id="blogger_blog.search" class="%blogger_blog.search.class%" scope="request">
           <argument type="service" id="request"/>
           <argument type="service" id="solarium.client"/>
       </service>
   </services>
</container>   

Dependency Injection (DI)
L'injection de dépendances (Dependency Injection) est un mécanisme qui permet d'implémenter le principe de l'inversion de contrôle. Il consiste à créer dynamiquement (injecter) les dépendances entre les différentes classes en s'appuyant sur une description (fichier de configuration ou métadonnées) ou de manière programmatique. Ainsi les dépendances entre composants logiciels ne sont plus exprimées dans le code de manière statique mais déterminées dynamiquement à l'exécution. [wikipedia.org]

src/Blogger/BlogBundle/DependencyInjection/BloggerBlogExtension.php

class BloggerBlogExtension extends Extension{

   /**

    * {@inheritDoc}
    */
   public function load(array $configs, ContainerBuilder $container)
   {
       $configuration = new Configuration();
       $config = $this->processConfiguration($configuration, $configs);

       $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
       $loader->load('services.xml');
   }
}

src/Blogger/BlogBundle/Controller/Search.php

class SearchController extends Controller{

   /**
    * @Template
    */
   public function blockSearchAction()
   {

       $request = $this->get('request');
       $simpleSearch = $request->request->get('simple_search');
       $form = $this->createForm(new BlockSearchType($request, $simpleSearch['keySearch']));

       return array(
           'form' => $form->createView(),
       );
   }

   /**
    * @Route("/search", name="search")
    * @HttpMethod({"GET", "POST"})
    * @Template
    */
   public function executeSearchAction()
   {
       
       $request = $this->get('request');     
       $resultsPerPage = 5;
       $solariumClient = $this->get('solarium.client');
       $query = $this->get('blogger_blog.search')->makeSearchQuery();
       $query->setRows($resultsPerPage);
       $allResults = $solariumClient->select($query);
       $totalResults = $allResults->getNumFound();
       $paginator = $this->get('knp_paginator');
       
       $pagination = $paginator->paginate(
           array($solariumClient, $query),
           $request->query->get('page', 1)/*page number*/,
           $resultsPerPage/*limit per page*/
       );

       return $this->render('BloggerBlogBundle:Search:search.html.twig', array(
                   'pagination' => $pagination,
                   'totalResults' => $totalResults,
       ));
               
   }

}



Télécharger l'intégrité de l'application:
solr symfony integration




Commentaires

  1. Bonjour,
    je pense que ce bundle est mieux :
    https://github.com/floriansemm/SolrBundle

    RépondreSupprimer
  2. le fichier Search.php a comme author un autre personne !

    RépondreSupprimer
  3. L'intégrité de l'application a télécharger est totalement loin de la description dans ce tutoriel, plus de détails ça sera mieux.

    RépondreSupprimer

Enregistrer un commentaire

Posts les plus consultés de ce blog

Connecting to MS Exchange Server with Thunderbird

SVN and GIT Tag with Jenkins Job