Navigation

Versions

22/11/2012 : correction escaping
21/11/2012 : Création

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (twitter accountplv) Dernière mise à jour : 22 November 2012

SOLR / Solarium, recherche en PHP

Introduction

Cette page indique quelques astuces et points techniques soulevées lors de la mise en place de SOLR 4 avec solarium 3 en PHP.

Pour l'installation, je ne détaille rien, je ne donne que quelques étapes, il faut se reporter aux doc SOLR et Solarium

Principe d'un moteur de recherche SOLR

On peut voir un moteur de recherche solr comme une table unique en base de données avec pas mal de colonnes. Et à la place de SQL, on a un langage de requêtage différent avec des fonctions de recherche hyper étendues (recherche fulltext, géographique, filtre des pluriels, accents, mots ignorés,...)

Dans le cas de SOLR, la définition des colonnes de la table unique est dans un fichier schema.xml. C'est le fichier le plus important de la configuration SOLR.

Dans la distribution solr, vous trouverez des exemple de configuration dans le répertoire "apache-solr-4.0.0/example/solr/collection1/conf"

Installation

Installer SOLR

Je ne vais pas détailler l'installation, reportez vous là la doc SOLR et solarium. En gros les étapes sont les suivantes :

  • Installer une machine virtuelle java
  • Installer Tomcat ou Jetty (un serveur d'appli Java)
  • Télécharger un binaire de Solr 4 et copier le fichier .war dans le bon répertoire du serveur d'appli
  • Allez sur la page d'accueil de la webapp solr (chez moi c'est http://localhost:8080/apache-solr-4.0.0/) . Vous devez tomber sur l'interface d'administration de votre solr

Mettre en place le "multicore" SOLR

Le "multicore" solr permet d'avoir plusieurs moteurs de recherche indépendants dans une même webapp lancée dans votre tomcat. Chaque moteur de recherche est alors un "core".

Cela permet aussi de recharger la configuration de votre moteur (le schema.xml) sans avoir à relancer tomcat.

Bref, ne vous posez pas de question, un solr se lance en multicore et puis c'est tout. Ne faites pas autre chose, ça serait une connerie.

Pour faire cela, il faut créer un fichier solr.xml, par exemple dans le répertoire /var/www/solr/solr.xml

Dans l'exemple ci-dessous les confs solr sont dans un répertoire que vous mettrez dans votre application : par exemple /var/www/my_app/config/solr/conf/shema.xml

<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false">
  <cores adminPath="/admin/cores">
    <core
        name="mycore"
        instanceDir="/var/www/my_app/config/solr"
        dataDir="/var/www/my_app/data/solr"
    />
  </cores>
</solr>

Dans le fichier de lancement de votre tomcat (le catalina.sh) ajouter une paramètre solr.solr.home qui pointe sur le répertoire /var/www/solr

export JAVA_OPTS="$JAVA_OPTS -Dsolr.solr.home=/home/webadmin/solr"

Une fois que votre solr est lancé en multicore, dans l'interface d'admin, vous pouvez recharger vos configurations (quand vous modifiez votre schema.xml par exemple) en cliquant sur "Core Admin" et le bouton "Reload"

Installer Solarium

Pour la version 3.0.0-RC1, il faut passer par GIT. Ensuite la librairie se trouvera dans library/Solarium.

# cloner le repository
git clone https://github.com/basdenooijer/solarium.git

# basculer sur le tag 3.0.0-RC1
git checkout 3.0.0-RC1

Utilisation basique

Je vous invite à aller voir la doc solarium v3 ;

http://wiki.solarium-project.org/index.php/V3:Basic_usage

Tips & tricks

Quelques points techniques utiles dans l'utilisation quotidienne de Solarium :

Escaping

Edit suite au commentaire de Bas de Nooijer (@basdenooijer) : En fait il existe un système d'escaping (et même 2 systèmes) dans Solarium.

ci-dessous des exemples de codes :

// avec la méthode manuelle (helpers)
$query = $client->createSelect();
$helper = $query->getHelper();
$query->setQuery("text:".$helper->escapePhrase($term));
$solrResultSet = $client->select($query);

// avec la méthode automatique (placeholder)
// reportez vous à la doc des placehoders (mentionnée au dessus) pour
// voir les syntaxes des %p1% et autres.
$query = $client->createSelect();
$query->setQuery("text: %p1%", array($term) );
$solrResultSet = $client->select($query);

Je laisse ici ma fonction d'escaping pour mémoire, mais il vaut mieux utiliser les fonctions ci-dessus.

// fonction d'escaping, mais a priori inutile si on utilise les fonctions natives de solarium.
// @deprecated !!!
function solrEscape($str)
{
    $escapeChars = array("\\", "+", "-", "&", "|", "!", "(", ")", "{", "}", "[", "]", "^", '"', "~", "*", "?", ":");
    $replacement = array();
    foreach ($escapeChars as $char) {
        $replacement[] = "\\".$char;
    }
    $result = str_replace($escapeChars, $replacement, $str);
    return $result;
}

// using the function
$query = $client->createSelect();
$query->setQuery("{!lucene q.op=AND df=text}text:".solrEscape($term));
$solrResultSet = $client->select($query);

Encodage des date

Il faut encoder les dates à la mano pour pouvoir les envoyer à SOLR (c'est d'ailleurs dommage que solarium ne fasse pas ça tout seul...)

Voilà la fonction d'encodage depuis un \DateTime, depuis un timestamp et depuis une date Mysql

// encodage depuis un \DateTime
$solrDate = $monDateTime->format('Y-m-d\TH:i:s\Z');

// depuis un timestamp
$solrDate = date("Y-m-d\TG:i:s\Z", $monTimestamp);

// depuis un DATETIME mysql
$solrDate = date("Y-m-d\TG:i:s\Z", strtotime($mysqlDate));

Conclusion

Globalement SOLR est un projet impressionnant. Il a jusqu'ici répondu à tous mes besoins fonctionnels. Je n'ai jamais eu de panne ou bug. Il est remarquablement rapide en lecture. (nous utilisons SOLR en production sur 3 ou 4 sites)

Avant nous utilisions l'extension SOLR de PHP (dans PECL). Nous avons basculé sur Solarium-3.0.0-RC1 parce que ça simplifie l'installation des serveurs. Que dire: c'est documenté, ça marche. Bon produit.

Prévention anti-troll : je n'ai jamais essayé elastic search. Les 2 ont bonne presse. Vous trouverez des dizaines de comparatifs dans Google, je vous laisse vous faire un avis.

Merci à Bas de Nooijer (le développeur de Solarium) pour la correction qu'il ma envoyée concernant l'escaping.

N'hésitez pas à m'envoyez vos remarques en commentaires.

Commentaires

Ajouter un commentaire
Re: Escaping options in Solarium
Thanks for your links. You're absolutely right, I will update my tutorial.
Escaping options in Solarium
For escaping in Solarium take a look at:
http://wiki.solarium-project.org/index.php/V3:Escaping
and
http://wiki.solarium-project.org/index.php/V3:Placeholders