Drupal : SolR c'est plus fort que toi

Monday, June 11, 2012

Drupal est un CMS très puissant. Il peut tout faire, à grand renfort de modules :D Cependant, il y a un domaine où il est particulièrement mauvais, la recherche dans le contenu ! Heureusement pour lui (et pour nous), ce moteur de recherche d’un autre age peut laisser sa place à Apache SolR. SolR est une formidable machine à indexer, facile à installer et à utiliser, voyons ça de suite.

Introduction

SolR est un moteur de recherche libre qui s’appuie sur la bibliothèque Lucene. D’ailleurs les deux projets ont ou vont fusionner ce qui est une très bonne chose pour la pérennité et les évolutions futures du produit. SolR est écrit en java, il a donc besoin d’un serveur d’applications j2ee comme Tomcat par exemple. Il suffit ensuite d’un module pour l’interfacer avec Drupal, ce dernier s’occupera d’envoyer le contenu à indexer et exécuter les requêtes de recherche. En plus de gagner énormément en temps d’exécution des recherches, SolR propose des options sympa pour affiner ses recherches (facettes, suggestions).

Pré-requis

Nous allons faire l’installation sur une Red Hat 6 ou équivalent avec un Drupal 6. On va partir sur la version 3.6 de SolR (dernière version au moment de l’article). Cette version nécessite Java en version 1.6 minimum et un Tomcat 6.

Installation de Java :

yum install java-1.6.0-openjdk
java -version

Installation de Tomcat :

yum install tomcat6
chkconfig tomcat6 on

Installation du module SolR pour Drupal

On va commencer par installer le module pour Drupal, la raison est que l’application SolR aura besoin de fichiers contenu dans le module. Donc commencer par le module permet d’avoir tout ce qui va bien au moment d’installer SolR :-)

Premièrement, on va à la racine de son Drupal :

cd /var/www/<drupal>/

Puis on installe le module avec l’utilitaire drush :

drush dl apachesolr

On ne peut pas l’activer de suite car il a besoin d’une librairie supplémentaire que l’on va installer :

cd /var/www/<drupal>/sites/all/modules/contrib/apachesolr
wget http://solr-php-client.googlecode.com/files/SolrPhpClient.r22.2009-11-09.tgz
tar zxvf SolrPhpClient.r22.2009-11-09.tgz
rm SolrPhpClient.r22.2009-11-09.tgz

Pour finir, on active les modules :

drush en apachesolr apachesolr_nodeaccess apachesolr_search

Installation de Apache SolR

Notre Tomcat est déjà installé, il va suffire de déployer les sources de SolR dans le webapps de ce dernier.

On récupère les sources :

cd /var/lib/tomcat6
wget http://wwwftp.ciril.fr/pub/apache/lucene/solr/3.6.0/apache-solr-3.6.0.tgz
tar zxvf apache-solr-3.6.0.tgz
rm apache-solr-3.6.0.tgz

On copie les fichiers nécessaires en particulier le war :

cp apache-solr-3.6.0/dist/apache-solr-3.6.0.war webapps/solr.war
cp apache-solr-3.6.0/example/solr . -r
rm -rf apache-solr-3.6.0

On met les bons droits (sinon impossible de lancer le tomcat) :

chown root:tomcat /var/lib/tomcat6 -R

Configuration Tomcat et ApacheSolR

On crée le fichier de conf tomcat pour l’application SolR :

vim /etc/tomcat6/Catalina/localhost/solr.xml

On ajoute la déclaration suivante :

<Context docBase="/var/lib/tomcat6/webapps/solr.war" debug="0" crossContext="true" >
   <Environment name="solr/home" type="java.lang.String" value="/var/lib/tomcat6/solr" override="true" />
</Context>

On édite le fichier de configuration tomcat pour ajouter le support de l’UTF8 :

vim /etc/tomcat6/server.xml

Modifier le connecteur sur le port 8080 comme ceci :

<Connector port="8080" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443"
              URIEncoding="UTF-8" />

On édite tomcat-users.xml :

<role rolename="manager"/>
      <user username="root" password="azerty" roles="manager"/>

On édite le fichier de configuration de l’application SolR :

vim /var/lib/tomcat6/solr/conf/solrconfig.xml

On modifie le chemin vers le répertoire des données :

<dataDir>/var/lib/tomcat6/solr/data</dataDir>

On copie les fichiers schema.xml et solrconfig.xml depuis le module Drupal :

cp /var/www/<drupal>/sites/all/modules/contrib/apachesolr/schema.xml /var/lib/tomcat6/solr/conf/
cp /var/www/<drupal>/sites/all/modules/contrib/apachesolr/solrconfig.xml /var/lib/tomcat6/solr/conf/

On lance le tomcat :

service tomcat6 start
tail -150 /var/log/tomcat6/catalina.out

Normalement, le démarrage du Tomcat ne doit générer aucune erreur. Vérifiez les droits sur le webapps Tomcat si vous avez des erreurs.

Configuration du module Drupal

Il reste a configurer Drupal pour qu’il communique avec SolR, on va se rendre sur l’interface d’administration du module SolR :
https:///admin/settings/apachesolr

Paramètres de connexion au tomcat :

localhost
8080
/solr

Puis cliquer sur “Enregistrer la configuration”. Le message “Apache Solr: Your site has contacted the Apache Solr server.” doit apparaitre avec validation du formulaire.

Commandes Drush et l’indexation

SolR s’appuie sur le cron Drupal pour indexer le contenu, il travail donc avec des petits lots (de 50 à 200) de nodes. Afin d’accélérer l’indexation au début, on va utiliser une commande Drush appelé via un cron système.

On édite la crontab :

crontrab -e

On ajoute un cron qui appel la commande drush solr-index toutes les 5 minutes :

# Cron index solr
*/5 * * * *    /usr/local/sbin/drush solr-index -r /var/www/<drupal>/ > /dev/null 2>&1

Ya plus qu’a attendre que SolR index l’ensemble du contenu, on peut vérifier l’avancement ici :
https:///admin/settings/apachesolr/index

Intégration dans Drupal

L’installation est finit, il reste a intégrer SolR dans notre Drupal. Là, ça sera à vous de jouer mais on peut voir en revu les options indispensables :D

Première option a activer rapidement, le remplacement du la boite de recherche générique par celle de SolR. Pour se faire, il suffit de se rendre dans l’interface d’admin :
https:///admin/settings/apachesolr

Puis de cliquer sur “Advanced configuration” et cochez la case “Make Apache Solr Search the default :”, la search_box ainsi que le formulaire (search/) sont remplacés par la version SolR. En trois cliques, voila SolR totalement opérationnel sur notre portail Drupal, si tous les modules s’utilisaient si facilement … :D

Recherche par facettes

Donc, faire des recherches rapides, ça on a fait mais pourquoi s’arrêter là ? SolR propose de la recherche par facettes, bon je ne suis pas un spécialiste mais grosso modo il s’agit d’affiner les résultats avec en entrer des paramètres supplémentaires. Ici on s’appuiera sur le système de mots clés Drupal, c’est à dire la taxonomie.

Dans le principe, on va créer un bloc par taxonomie qui s’afficheront sur la page des résultats de recherche pour filtrer cette dernière. Il faut d’abord créer le bloc puis l’afficher dans le bandeau de droite (par exemple) avec l’interface de gestion des blocs.

Dans la liste des filtres possibles (taxonomies + des champs propres à vos content types), sélectionnez ceux à créer :
https:///admin/settings/apachesolr/enabled-filters

Il faut ensuite se rendre ici pour placer les nouveaux blocs, on peut aussi les ordonner suivant leur “importance” :
https:///admin/build/block

Ces blocs s’afficheront lors de recherches si la taxonomie ou autre est utilisée par les résultats de recherche.

Auto-complétion

Option sympa, très “web 2.0”, l’auto-complétion assiste l’utilisateur lorsque qu’il initie une recherche en lui suggérant des mots au fur et à mesure de la saisie. Pourquoi s’en passer d’autant plus que l’installation se résume à deux commandes Drush :

drush dl apachesolr_autocomplete
drush en apachesolr_autocomplete

Les suggestions

Autre option sympa, les suggestions. Il s’agit d’un bloc qui va être affiché sur une page de contenu et proposant des liens vers d’autres contenus en rapport avec celui ci. SolR utilise les mots clés trouvés pour proposer des pages en rapport, et ça marche pas mal. Dans l’interface d’admin des blocs, vous trouverez un bloc nommé “Apache Solr recommendations: More like this”, c’est cette option.

Aller pour conclure, un peu d’amusement. Je cherchais un moyen de bloquer la search-box dans le coin en haut à droite quand on scroll vers le bas. Comme ça, la recherche est toujours disponible même si on est tout en bas d’une page trèèès longue. Pour mettre cela en œuvre, un simple javascript va modifier la CSS de la search-box à chaud.

On crée le javascript :

vim /var/www/<drupal>/sites/all/themes/<mon_theme>/search-box-sticky.js

Avec le script suivant :

window.onscroll = function()
{
        if( window.XMLHttpRequest ) {
                $object = document.getElementById("search-box");
                if (document.documentElement.scrollTop > 30 || self.pageYOffset > 30) {
                        $object.style.position = 'fixed';
                        $object.style.top = '0px';
                        $object.style.right = '0px';
                } else if (document.documentElement.scrollTop < 30 || self.pageYOffset < 30) {
                        $object.style.position = 'relative';
                        $object.style.float = 'left';
                }
        }
}

Vérifier l’ID de votre search-box, mais normalement c’est le nom par défaut. Ajuster la valeur a partir de laquelle le script modifie la CSS. Dans mon cas la box est à 30 pixel du haut.

Enfin, il faut inclure ce script dans le head de nos pages :

vim /var/www/<drupal>/sites/all/themes/<mon_theme>/page.tpl.php

Ajouter la ligne suivante avant la fin du HEAD :

<script type="text/javascript" src="/sites/all/themes/<mon_theme>/search-box-sticky.js"></script>

Références

ArticleGeekapache solrcmsdrupalindexationlucenerecherche par facettessolrtomcat
Le contenu de ce site est sous licence Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)

Gamb

DIY

Tomber le moteur en deux deux et tout seul !

Cisco : Se connecter en cable console sous Linux