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
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
- Doc SOLR 4 : http://lucene.apache.org/solr/4_0_0/tutorial.html
- Doc Solarium 3 : http://wiki.solarium-project.org/index.php/Solarium_3.x_manual
- Exemples de codes solarium : https://github.com/basdenooijer/solarium/tree/3.0.0-RC1/examples
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 ;
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.
- à la main : http://wiki.solarium-project.org/index.php/V3:Escaping
- automatiquement : http://wiki.solarium-project.org/index.php/V3:Placeholders
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
Note : on ne peut plus ajouter de commentaire sur ce site