The trashiest blog in the World...

Aller au contenu | Aller au menu | Aller à la recherche

Installation d'une instance Solr - Fedora-fr

J'ai déjà parlé ici même de la mise en place d'un système de recherche alternatif pour la documentation francophone de Fedora, basé sur Solr, et utilisable via une interface de recherche PHP et un bot IRC.
Les annonces faisant suite à la mise en place du système de recherche et du bot IRC ainsi que l'annonce de la mise en ligne de l'interface de recherche PHP sont toutes deux disponibles dans les archives de mon blog.

J'expliquerai ici comment s'installe le système de recherche, et comment indexer des données, je l'ai promis à un fantôme qui a passé du temps à essayer d'installer ça sans grand succès :-)

Installation

Solr est une application web écrite en Java, qui nécessite l'installation et la configuration d'un moteur de servlets. La distribution officielle de Solr embarque une instance Jetty, mais j'ai préféré utiliser tomcat, que je connais bien mieux :-)
Sous Fedora, lancez simplement (en root) :

# yum install tomcat6 tomcat6-webapps

Lors de l'installation de ce paquet, un utilisateur nommé tomcat est créé, mais le compte n'est pas accessible par défaut. Il est toutefois possible de s'y connecter en spécifiant le shell à utiliser :

# su -s /bin/bash tomcat

Le reste des opération est à effectuer avec l'utilisateur tomcat. Si vous préférez ne pas utiliser les RPM de tomcat, vous devrez vous assurer que l'utilisateur qui fera tourner le serveur a bien tous les droits nécessaires dans les différents dossiers. Dans tous les cas, il faudra procéder à une petite modification du fichier /etc/tomcat6/server.xml en raison de certains problèmes d'encodage... Cherchez le connecteur HTTP, et ajoutez l'attribut URIEncoding="UTF-8" :

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

Récupérez tout d'abord les fichiers de configuration propres à la documentation francophone, le script d'installation et les outils nécessaires sur mon dépôt mercurial (vous pouvez récupérer directement une archive) :

$ hg clone http://hg.ulysses.fr/solr-config_fedora-fr

Vous obtiendrez un dossier avec le contenu suivant :

$ cd solr-config_fedora-fr
$ ll
drwxrwxr-x. 4 trasher trasher    4096 21 mai   23:13 cores
-rwxrwxr-x. 1 trasher trasher     455 21 mai   23:33 install.sh
drwxrwxr-x. 2 trasher trasher    4096 21 mai   04:17 preprocess
-rw-rw-r--. 1 trasher trasher    2115 21 mai   23:43 README
-rw-rw-r--. 1 trasher trasher     230 21 mai   23:30 solr-tomcat-context.xml

Dont voici un bref descriptif :

  • dossier cores  : contient la configuration de l'instance, et contiendra aussi par la suite les données d'indexation de cette instance,
  • fichier install.sh : script basique d'installation,
  • dossier preprocess : relatif à l'indexation, voir plus bas ;),
  • fichier README : est-ce utile de préciser ? :-D,
  • fichier solr-tomcat-context.xml : configuration de l'application web dans tomcat.

Le script d'installation effectue quelques tâches rébarbatives et basiques, à savoir :

  1. télécharge les fichiers Solr (war et jar) depuis mon propre site (et non le site officiel, l'archive officielle pèse environ 80Mo alors que nous n'avons réellement besoin que de 9Mo...),
  2. copie les fichiers récupérés aux emplacements adéquats (dans le dossier courant, bien entendu),
  3. modifie le fichier de contexte tomcat (solr-tomcat-context.xml) pour adapter les chemins,
  4. crée un lien symbolique nommé solr.xml dans le dossier /etc/tomcat6/Catalina.localhost/ vers le fichier de contexte. De cette façon, lors du démarrage de tomcat, l'application sera déployée automatiquement,
  5. modifie, dans la configuration de l'instance, le chemin vers le fichier des données à indexer.

À ce stade, vous devriez être en mesure d'accéder à l'application :-) Pour vérifier :

  • lancez le service :
service tomcat6 start && tailf /var/log/tomcat6/catalina.out
  • vérifiez la sortie de la commande tail pour voir si des erreurs se sont produites au démarrage de tomcat
  • si tout est ok, vous devriez pouvoir accéder à l'application à l'adresse :

http://localhost:8080/solr/

Page d'accueil de l'application Solr

Le lien vers l'interface d'administration de l'instance devrait vous amener sur une page semblable à : solr-fedora-fr_doc-admin.jpg

L'exécution de la requête par défaut ne renverra aucun résultat, et c'est bien normal, nous n'avons pas encore traité les données. Allez, hop ! La suite ! :-p

Indexation des données

Les données du wiki sur Fedora-fr.org sont stockées dans une base de données MySQL. Il serait possible avec Solr d'indexer directement le contenu de cette base, mais cela demandez bien entendu à avoir accès. Je ne souhaitais pas le moins du monde ouvrir le port MySQL sur le serveur ; j'ai donc décidé de passer par un dump.

Puisque XML est utilisé à toutes les sauces, que MediaWiki permet un export au format XML de ses données, et que je travaille actuellement avec du XML/XSLT au quotidien, c'est tout naturellement que j'ai choisi ce format :-p

L'export côté MediaWiki s'effectue avec la commande :

$ php {mediawiki}/maintenance/dumpBackup.php --conf {mediawiki}/LocalSettings.php --full --output=gzip:wiki.xml.gz

Copiez le fichier .gz résultant dans le dossier preprocess.

Il aurait été possible de travailler directement sur l'export XML de MediaWiki pour indexer les données, ça ne m'a pas semblé être un bon choix. En effet, les informations récupérées pour les articles se cantonnent principalement au titre et au contenu intégral. Plutôt limité alors que sur le wiki, les articles sont attachés à des catégories, des macros pour stipuler les auteurs et contributeurs de l'article sont utilisées, de même qu'un balisage spécifique qui avait été mis en place il y a quelques années par Pascal pour son export PDF de la documentation. Il était donc possible et surtout intéressant d'enrichir nos index de recherche avec ce type d'informations.

J'ai donc travaillé sur une feuille XSLT qui effectue les tâches suivantes :

  • suppression de toutes les anciennes révisions, seule la dernière version de l'article nous importe ici,
  • extraction de la liste des auteurs (macro Auteur et Auteurs), contributeurs (liste des utilisateurs ayant édité l'article), catégories, applications (balise <app>) et paquets (balise <paquet>,
  • récupération des noms (les comptes sur le wiki étant créés selon le schéma PrénomNom.

Une fois l'export XML récupéré depuis MediaWiki, il faut donc lui appliquer les transformations XSL décrites dans le fichier preprocess/wiki.xsl. Cette feuille utilise des techniques (notamment les expressions régulières) qui ne sont pas présentes dans la version 1.0 de XSLT, mais uniquement en XSLT2... Les outils qui ne gèrent pas XSLT2 (tels que xsltproc) ne pourront pas être utilisés ; on utilisera saxon :

$ cd preprocess
$ gunzip -c --stdout wiki.xml.gz > wiki.xml
$ java -jar ./saxon9he.jar -t -s:wiki.xml -xsl:wiki.xsl -o:wiki_formatted.xml

À titre d'exemple, vous pouvez consulter l'export XML de l'article sur l'installation et la configuration d'Apache, puis le résultat de la transformation XSL appliquée à cet article.

C'est bien entendu le fichier résultant de la transformation XSL que nous allons indexer avec Solr. Le fichier XML (et, oui, encore du XML !) cores/doc/conf/wiki.xml définit la liens entre les éléments XML et les index Solr configurés. Ce fichier indique aussi le chemin complet du fichier contenant les données ; ce chemin a normalement été mis à jour automatiquement si vous avez utilisé le script d'installation (vérifiez la valeur de l'attribut /dataConfig/document/entity/@url , il devrait pointer sur le fichier preprocess/wiki_formatted.xml.

Maintenant que tout est bien configuré, que les chemins sont corrects, et que l'export XML de MadiaWiki est passé à la moulinette XSLT ; il reste à indexer les données, en appelant simplement l'URL :
http://localhost:8080/solr/dataimport?command=full-import

Ces opérations sont « automatisées » dans le script indexation.sh fournit dans le projet Mercurial. Ce fichier me permet de récupérer l'export XML sur le serveur defora-fr.org ; vous devrez donc commenter les lignes rsync et gunzip pour l'utiliser ;-)

Pour tester le fonctionnement, nous allons effectuer une recherche dans les titres uniquement (champ titleText) sur le terme « network » ; qui devrait nous ramener les articles dont le titre contient les termes « network » et « réseau » :
http://localhost:8080/solr/fedora-fr_doc/select/?q=titleText:network&version=2.2&start=0&rows=10&indent=on

Résultats de la recherche Solr network dans les titres

Qui ramène aujourd'hui 7 résultats :-)

L'URL http://localhost:8080/solr/admin/cores?action=STATUS vous donnera des informations sur l'instance :

  • le nombre de documents indexés,
  • la date de dernière modification des index,
  • le chemin de stockage des données de l'index,
  • ...

Et voilà ; l'instance Solr de recherche dans la documentation francophone de Fedora est en place. Bien entendu, un système comme Solr apporte de nombreuses fonctionnalités, qui ne sont pas forcément exploitées ici ; pour de multiples installations par exemple, il serait bien plus efficace d'utiliser les fonctions de réplication offertes par Solr, mais je n'ai pas encore eu l'occasion d'y regarder.

Voici quelques petites choses que Solr peut faire :

  • affichage des résultats aux formats xml, csv, json, php, phps (php sérialisé), ... Pour modifier le format de sortie, ajoutez (ou modifiez) le paramètre d'URL wt : wt=php
  • choix des informations affichées dans les résultats : lister les champs voulus (séparés par une virgule) voulue avec le paramètre d'URL fl (field list) : fl=titleText,author,category
  • ... :-D

Je vous invite à consulter la liste des fonctionnalités de Solr pour en savoir un peu plus sur le produit lui même, la documentation concernant l'écriture de requêtes Solr, et aussi la documentation des paramètres communs de requêtes Solr pour aller un peu plus loin. L'interface d'administration de l'instance fournie par Solr peut également vous aider à effectuer des recherches plus facilement :)

Commentaires

1. Le dimanche 22 mai 2011, 22:47 par trashy

Je viens de rencontrer un problème d'encodage sur l'installation Tomcat ; qui se corrige en ajoutant l'attribut @@URIEncoding="UTF-8"@@ au connecteur HTTP :

<connector port="8080" protocol="HTTP/1.1"
connectiontimeout="20000"
redirectport="8443"
uriencoding="UTF-8"/>

J'ai ajouté cette précision dans l'article :-)