RAPPORT DE STAGE Sujet de recherche sur le moteur de recherche open source Apache Solr et sa comparaison avec les autres plates-formes de recherche existantes 07-08/2014 MENTAT CONSEIL LOUIZI Hamza Remerciements Il n’est jamais facile pour un étudiant de trouver un stage, c’est pourquoi je tiens à remercier monsieur Abdeljalil GUEDDOU, directeur de Mentat Coseil de m’avoir accepté en tant que stagiaire au sein de sa société. Je tiens aussi à remercier mon tuteur de stage monsieur Rafik AMEUR pour son soutien technique et son encadrement tout au long de ma période de stage et monsieur Tarik Saidi pour son soutien moral et pour l’intérêt qu’il m’a porté tout au long de ces deux mois. D’une façon plus générale, je remercie toute l’équipe pour leur bienveillance et leur accueil chaleureux lors de mon stage. 1 de Mentat Conseil Sommaire Remerciements .................................................................................................................................. 1 Introduction ........................................................................................................................................ 3 1. Présentation de la société Mentat Conseil ................................................................................ 4 2. Etude des besoins ...................................................................................................................... 5 3. Moteur de recherche ................................................................................................................. 6 3.1. Fonctions de bases .................................................................................................................. 6 3.2. Fonctions avancées ................................................................................................................. 7 4. 5. 6. Recherche Full-Text .................................................................................................................. 9 4.1. La recherche par radicaux ................................................................................................ 9 4.2. La recherche par consonances ........................................................................................ 10 Présentation de LUCENE ....................................................................................................... 11 5.1. Principe ............................................................................................................................ 11 5.2. Indexation ........................................................................................................................ 12 5.3. Recherche......................................................................................................................... 12 5.4. Classes d’indexation ........................................................................................................ 13 5.5. Classes de recherche ........................................................................................................ 13 Présentation d’Apache Solr .................................................................................................... 15 6.1. Mise en place.................................................................................................................... 16 6.2. Principe de fonctionnement ............................................................................................. 17 7. Comparaison ........................................................................................................................... 22 8. Conclusion ............................................................................................................................... 28 9. Références Bibliographiques................................................................................................... 29 2 Introduction e C stage, d’une documentation durée sur la de deux plate-forme mois, a consisté logicielle de à établir recherche Solr une et à commencer son intégration dans les projets existants de la société. Ce rapport présente le travail que j’ai effectué lors de mon stage au sein de la société Mentat Conseil et qui s’est déroulé du 08 Juillet au 08 Septembre 2014. J’ai divisé cette période en deux parties, pendant la suis familiarisé forme avec logicielle l’environnement d’Apache et j’ai technique consacré la première période je me que proposait deuxième partie cette de plate- mon stage pour mon à quelques tests d’intégration de ce moteur de recherche très puissant. Le projet réalisé s’est expérience professionnelle. présentation exhaustive avéré Le de apprendre ou approfondir, faire tour d’horizon un très but de tous mais intéressant ce les aussi, et rapport aspects de n’est aspects techniques dans ce rapport en je vous pas techniques manière des enrichissant et de faire une que j’ai pu claire, de j’ai été présentation de synthétique humains et auxquels confronté. Je vous l’entreprise, expose ensuite, durant ces deux explique mois et enfin, les premier différents en conclusion, stage. 3 lieu une aspects je résume les de mon travail apports de ce 1. Présentation de la société Mentat Conseil Mentat Conseil est une société de conseil et d’intégration de solutions informatiques spécialisée dans le domaine de la relation client et ceci depuis dix ans. Elle œuvre dans le conseil, l’étude, l’intégration, le support, la maintenance et l’infogérance de solutions de communication d’entreprise. Mentat Conseil offre l’accompagnement à la conception et mise en œuvre de technologies et de solutions de communication pour entreprise ainsi que l’intégration et la mise en œuvre de plates-formes logicielles propriétaires ou libres. Depuis sa création, de grands comptes sur le marché national et international font confiance à Mentat Conseil qui accompagne ses clients dans l’étude, la mise en place et l’exploitation de solutions de centre de contacts. Parmi ses clients les plus prestigieux on distingue : AXA, Orange et SFR. Ses partenaires sont eux aussi connus, on trouve : Genesys, Synchrone Technologies et Customer-Square. 4 2. Etude des besoins La mission que j’ai eu à remplir à Mentat Conseil consiste à fournir une plate-forme de recherche qui établit des recherches dans les bases de données des applications créées par l’entreprise ainsi qu’une comparaison des moteurs open source les plus connus. Actuellement, il existe plusieurs moteurs qui peuvent répondre aux besoins de l’entreprise en matière de recherche mais celui qui semble les intéresser le plus est la plate-forme logicielle de recherche Apache Solr. Dans la suite de ce rapport, j’essayerai bien évidemment de comparer les outils existants avec celui proposé pour mon sujet de stage et de prouver pourquoi cette plate-forme est la mieux adaptée aux besoins de l’entreprise, j’expliquerai par la suite les méthodes par lesquelles on peut intégrer ce moteur de recherche très puissant d’Apache. 5 3. Moteur de recherche Avant de faire la comparaison des solutions trouvées lors de ma recherche avec celle qu’on m’a proposée, il faut donner quelques notions de bases qui nous introduiront petit à petit au vif du sujet. Il s’agit bien entendu d’une brique essentielle d’applications de gestion d’information. Trois tendances non exclusives existent dans les solutions de GED (gestion documentaires) : Intégration d’un moteur de recherche, les solutions open source intègre souvent Lucene, moteur de référence du monde open source Exploitation de la recherche sur de la base de données, ceci peut limiter les fonctions disponibles (notamment lemmatisation, troncatures…) Ouverture vers des solutions de recherche du marché (propriétaire) via des connecteurs 3.1. Fonctions de bases A minima, le moteur de recherche d’une GED doit : indexer les fiches documentaires, c'est-à-dire toutes les métadonnées d'un document indexer les documents électroniques en texte intégral (ou « full text »), c'est-à-dire en prenant en compte le contenu des fichiers électronique, pour tous ceux qui incluent du contenu textuel filtrer ses résultats de recherche selon les habilitations en lecture de l’utilisateur, c’està-dire ne lui proposer que des documents qu’il a le droit de lire permettre des recherches aussi bien sur l’intégralité d’un document que sur un ou plusieurs champs spécifiques de métadonnées. permettre l’utilisation des tables de référence dans les interfaces de recherche permettre les recherches utilisant plusieurs critères associés avec des opérateurs booléens (ET, OU, SAUF), ainsi que des parenthèses 6 permettre de mixer les approches documentaires, sur les métadonnées et le texte intégral autoriser les troncatures centrales et à droite, implicitement ou par l’utilisation de caractères génériques qui remplace un ou plusieurs caractères (classiquement l’étoile « * » ou le « ? ») permettre de personnaliser les pages de recherche, si possible plusieurs pages différentes, pour correspondre aux attentes des utilisateurs 3.2. Fonctions avancées L’utilisation de moteurs élaborés est souvent envisagée pour prendre en charge des fonctions avancées comme : permettre l’enregistrement de résultats sous forme de « panier » par exemple, pour permettre aux utilisateurs de constituer une sélection permettre l’enregistrement des stratégies de recherche, c'est-à-dire les critères utilisés pour la recherche, afin de pouvoir les relancer simplement rechercher successivement de façon à affiner une requête par rapport aux résultats de la recherche précédente étendre une recherche, par rapport à des synonymes par exemple fédérer la recherche sur plusieurs bases documentaires automatiser les approximations, suggestion orthographique et la lemmatisation (c'est-àdire la recherche sur les racines des mots) permettre la recherche en langage naturel ou recherche par l’exemple, c'est-à-dire déduire l’équation de recherche d’une phrase ou d’un texte interprété par le moteur suggérer des résultats approchant à l’issue d’une recherche, par différents moyens : o explicites, via des liens entre documents spécifiés dans l’indexation de chacun. o implicites, des rapprochements issus de calculs statistiques ou sémantiques détecter automatiquement des « entités nommées », c'est-à-dire des noms propres (personnes, lieux) et de leurs relations. 7 Parmi les besoins fréquemment évoqués, on retrouve par exemple : la navigation par arborescence, la recherche sur intervalle de dates, la recherche simple (pour les aficionados de Google), la recherche par référence, la recherche fédérée couvrant à la fois la GED et les applications tierces. Il est donc fondamental d’analyser les attentes des utilisateurs pour définir leurs besoins de recherche. C’est un bon point de départ pour bâtir l’architecture (structure des données et ergonomie) de l’application cible. Tous les outils proposent une fonction de recherche à minima sur les métadonnées. Les fonctions de recherche plus avancées ne seront pas disponibles nativement et demanderont une intégration ou une configuration. 8 4. Recherche Full-Text La recherche full-text est le principe d'opérer des traitements (l'indexation) sur du texte afin d'y retrouver plus facilement des mots. Ce procédé consiste à effectuer une suite de manipulations sur chacun des mots du texte afin d'augmenter la pertinence des recherches. En règle générale, les interfaces de recherche full text permettent de segmenter le texte en mots (tokens) selon diverses règles (espaces, ponctuation, changement de casse etc.). Les manipulations possibles sur ces mots sont diverses : modifier la casse, remplacer les lettres accentuées, etc. Outre ces traitements simples (et qui ne sont pas toujours judicieux), il existe deux procédés plus complexes mais qui donnent de meilleurs résultats : la recherche par radicaux (lexèmes) et la recherche par consonances (phonétique). 4.1. La recherche par radicaux Un lexème est la forme élémentaire de chaque mot, c'est en quelque sorte sa racine linguistique. C'est sa forme, réduite au point de ne pas avoir d'existence dans la langue écrite ou orale, mais qui sert de point de départ pour toutes les formes dérivées de ce mot. Le procédé permettant d'obtenir le lexème d'un mot s'appelle la racinisation, ou stemming en anglais. Le lexème est le point de départ pour constituer les lemmes, qui sont eux-mêmes le point de départ pour constituer les mots. La racinisation est un procédé complexe et il est différent dans chaque langue, c'est pourquoi il n'existe pas d'algorithme informatique pour toutes les langues. De même, les algorithmes existants ne sont pas implémentés dans tous les langages informatiques. Ainsi, le langage informatique convenant le mieux à vos choix techniques (Java, .NET, PHP, etc.) n'a peut-être pas d'implémentation d'un algorithme de racinisation pour les langues qui vous intéressent. Un projet, cependant, facilite leur implémentation : Snowball. Il présente une liste d'exemples pour chaque algorithme, notamment en français. La flexion consiste à dériver un mot afin d'obtenir toutes ses représentations possibles : déclinaisons grammaticales (genre et nombre), conjugaisons, préfixes, suffixes et modifications du radical. C'est l'approche inverse de la racinisation, mais l'effet en est souvent proche. 9 En informatique, plusieurs programmes et bibliothèques permettent de fléchir un mot : ispell (d'adoption historiquement plus large), aspell/pspell (remplacement d'ispell), MySpell/Hunspell (créés par OpenOffice.org et utilisés par Mozilla), etc. Leur nombre croissant, un projet connexe a vu le jour : Enchant, qui propose une API commune et qui permet donc d'utiliser n'importe lequel de ces programmes avec les mêmes appels de fonctions. L'inconvénient majeur de la méthode par flexion est qu'elle ne donne de bons résultats que si l'on part d'un mot équivalent au lexème (mot non fléchi). Par exemple, si dans le texte se trouve le mot "développaient" et qu'un utilisateur cherche le mot "développement", une méthode par flexion est incapable de les faire correspondre. En revanche, une méthode par racinisation permet de retrouver le lexème commun à ces deux mots : "développ". 4.2. La recherche par consonances Soundex est un algorithme décrit en 1918 par Robert C. Russell and Margaret K. Odell. Il permet de décrire la prononciation des mots anglais au moyen de lettres et de chiffres. Soundex est prévu exclusivement pour la langue anglaise et, même dans cette langue, il a des limites. Les algorithmes Metaphone (1990) et Double Metaphone (2000), tous deux par Lawrence Philips, permettent une meilleure représentation des mots pour la langue anglaise. Le Double Metaphone permet en principe de mieux identifier le contexte d'utilisation de chaque mot, et ce dans diverses langues (notamment le français). Pour ma part, je ne suis pas persuadé qu'il soit possible de déterminer la prononciation d'un mot, et donc sa représentation informatique, sans savoir dans quelle langue (voire même dans quel dialecte local) il est utilisé. Toutefois, Double Metaphone semble être l'algorithme bénéficiant de la plus vaste adoption de nos jours. 10 5. Présentation de LUCENE Lucene est une bibliothèque open source écrite en Java qui permet d'indexer et de chercher du texte. Il est utilisé dans certains moteurs de recherche. C'est un projet de la fondation Apache mis à disposition sous licence Apache. Il est également disponible pour les langages Ruby, Perl, C++, PHP, C#. Lucene est une librairie open source en Java (mais il existe de nombreux portages) permettant d’ajouter des fonctionnalités de recherche plein-texte à vos applications. Il s’agit bien d’une librairie avec laquelle il n’est pas fourni d’outils permettant l’indexation de données en quelques clics de souris et quelques paramétrages. Il faut donc en passer par du code Java afin de mettre en place une solution sur mesure de recherche plein-texte. 5.1. Principe Lucene indexe et retrouve des “documents”. Par document, on ne parle pas de fichiers Excel, Word, PDF ou HTML, mais d’une structure de données constituée de champs. Un champ est une donnée possédant un nom (titre, auteur, date de publication, contenu, ..) et à laquelle est associé du texte. C’est ce texte qui est indexé, recherchable et affichable. Les documents indexés sont regroupés au sein d’une collection de documents appelée “index”. Un index peut contenir plusieurs centaines, milliers ou millions de documents et il est possible de créer autant d’index différents que le nécessite votre ou vos applications. Physiquement, un index est un répertoire (que vous spécifiez) hébergeant un nombre variable de fichiers (ça c’est l’affaire de Lucene). Si le texte qui est à indexé est contenu dans des fichiers Excel, Word, PDF ou HTML, c’est de votre ressort d’en extraire de contenu textuel qui sera indexé. Il est possible d’utiliser par exemple pdftotext pour les fichiers PDF et Antiword pour les fichiers Microsoft Word. 11 5.2. Indexation Jusqu'à l'explosion de l'internet, la classification décimale de Dewey était très efficace pour catégoriser des objets dans une bibliothèque. Cependant, comme la somme des données collectée est devenue trop vaste, il faut maintenant utiliser des moyens alternatifs et plus dynamiques pour trouver de l'information. Au cœur de tous les moteurs de recherche se trouve un mécanisme d'indexation automatique : en traitant une seule fois les données brutes et en leur donnant de multiples liens hautement efficients, on accélère l'opération de recherche. Le concept est assez analogue à l'index terminologique que l'on trouve généralement à la fin d'un livre, qui permet de trouver rapidement les pages qui traitent d'un sujet donné. Si l'on a besoin de couvrir un large champ de fichiers ou de trouver une chaîne de caractères précise dans un seul fichier, il ne faut pas scanner séquentiellement chaque fichier pour la phrase donnée. Car, plus le nombre de fichiers est grand, plus longue est la recherche d'information. Il vaut mieux établir un index des textes dans un format qui permet la recherche rapide, ce qui évite la méthode séquentielle. Ce processus est appelé indexation. 5.3. Recherche La recherche est l'action de regarder des mots dans un index pour trouver des références à des documents lorsqu'ils apparaissent. La qualité d'une recherche est évaluée par le positionnement et la pertinence des résultats. Cependant, d'autres facteurs entrent en compte dans une recherche. La rapidité est un facteur déterminant pour traiter une vaste quantité d'informations. De même, pouvoir supporter des requêtes simples ou complexes, des interrogations de phrases, des caractères, les résultats de positionnement et de tri sont aussi importants qu'une syntaxe facile à prendre en main pour entrer ces requêtes. 12 5.4. Classes d’indexation IndexWriter - La classe IndexWriter est le composant central du processus d'indexation. Cette classe crée un nouvel index et ajoute des documents à un index existant. On peut se la représenter comme un objet par lequel on peut écrire dans l'index mais qui ne permet pas de le lire ou de le rechercher. Directory - La classe Directory représente l'emplacement de l'index de Lucene. IndexWriter utilise une des implémentations de Directory, FSDirectory, pour créer son index dans un répertoire dans le Système de fichiers. Une autre implémentation, RAMDirectory, prend toutes ses données en mémoire. Cela peut être utile pour de plus petits indices qui peuvent être pleinement chargés en mémoire et peuvent être détruits sur la fin d'une application. Analyzer - Avant que le texte soit dans l'index, il passe par l'Analyser. Celui-ci est une classe abstraite qui est utilisée pour extraire les mots importants pour l'index et supprime le reste. Cette classe tient une part importante dans Lucene et peut être utilisée pour faire bien plus qu'un simple filtre d'entrée. Document - La classe Document représente un rassemblement de champs. Les champs d'un document représentent le document ou les métadonnées associées avec ce document. La source originelle (comme des enregistrements d'une base de données, un document Word, un chapitre d'un livre, etc.) est hors de propos pour Lucene. Les métadonnées comme l'auteur, le titre, le sujet, la date, etc. sont indexées et stockées séparément comme des champs d'un document. Field - Chaque document est un index contenant un ou plusieurs champs, inséré dans une classe intitulé Field. Chaque champ (field) correspond à une portion de donnée qui est interrogé ou récupéré depuis l'index durant la recherche. 5.5. Classes de recherche IndexSearcher - La classe IndexSearcher est à la recherche ce que IndexWriter est à l'indexation. On peut se la représenter comme une classe qui ouvre un index en mode lecture seule. 13 Term - Un terme est une unité basique pour la recherche, similaire à l'objet field. Il est une chaîne de caractère : le nom du champ et sa valeur. Notez que les termes employés sont aussi inclus dans le processus d'indexation. Query - La classe Query est une classe abstraite qui comprend BooleanQuery, PhraseQuery, PrefixQuery, PhrasePrefixQuery, RangeQuery, FilteredQuery, et SpanQuery. TermQuery - C'est la méthode la plus basique d'interrogation de Lucene. Elle est utilisée pour égaliser les documents qui contiennent des champs avec des valeurs spécifiques. QueryParser - La classe QueryParser est utilisée pour générer un décompositeur analytique qui peut chercher à travers un index. Hits - La classe Hits est un simple conteneur d'index pour classer les résultats de recherche de documents qui apparaissent pour une interrogation donnée. Pour des raisons de performances, les exemples de classement ne chargent pas depuis l'index tous les documents pour une requête donnée, mais seulement une partie d'entre eux. 14 6. Présentation d’Apache Solr Solr est une plate-forme logicielle de recherche s'appuyant sur le moteur de recherche Lucene, créé par la Fondation Apache et distribuée et conçue sous licence libre. Solr utilise le langage Java et est exécuté par un conteneur de servlets, comme par exemple Tomcat. Il communique avec le client à l'aide d'une interface de programmation en XML et JSON, généralement via le protocole HTTP. C’est un outil open source permettant de mettre en place des fonctionnalités de recherche dans différents types d’applications et notamment des sites web (mais pas seulement). Solr est basé sur Lucene. Solr offre la possibilité d'importer des données depuis une base de données, ou même un flux RSS. Pour la base de données, les colonnes d'une table deviendront les champs du Document manipulé. Comme Lucene, Solr est développé en Java. Il étend les fonctionnalités de Lucene et en simplifie la mise en oeuvre. Sorl fournit principalement 3 choses : un web service d’indexation des données un web service de recherche une interface web d’administration Avec Solr, les documents sont ajoutés à une collection via “XML over HTTP” (une requête HTTP en mode POST qui envoie des données XML décrivant le document à indexer), et les recherches sont faites avec au moyen d’une requête HTTP qui retourne un résultat au for mat XML (les documents correspondants à la requête). Le traitement des requêtes HTTP par Solr se fait au moyen d’une servlet (installé sous Tomcat par exemple). Solr gère le spell sheck : si des termes sont proches que certains présents au sein de documents indexés, il propose des propositions de termes à rechercher. Google dispose de la même fonctionnalité. 15 Cette fonctionnalité permet de mettre en surbrillance les termes recherchés. Ce principe est le même que les pages "en cache" de Google où les termes recherchés apparaissent surlignés en jaune. C'est une fonctionnalité puissante et pratique. Une des caractéristiques intéressantes de Solr est la gestion des facettes. Cette fonctionnalité permet de regrouper les informations par catégories. C'est de plus en plus utilisé aujourd'hui car c'est très pratique et rapide. Figure 1: Exemple de gestion de facettes 6.1. Mise en place Pour télécharger la dernière archive d'Apache Solr, il suffit de la récupérer à l'adresse http://www.apache.org/dyn/closer.cgi/lucene/solr. Une fois téléchargée, il suffit simplement d'extraire l'archive à l'endroit souhaité. Une application complète de démonstration est fournie dans le répertoire "example". Il est donc plus simple de considérer ce répertoire comme le répertoire de travail, et y effectuer les modifications voulues. En effet, Solr est déjà configuré pour être lancé avec Jetty. Pour lancer le serveur, il suffit de lancer la commande suivante en ligne de commandes dans le répertoire "example" : java -jar start.jar Cette commande lance ainsi le serveur d'application Jetty sur le port 8983, et les informations de logging apparaissent dans le terminal. 16 6.2. Principe de fonctionnement Pour montrer comment fonctionne Apache solr je vais présenter un simple exemple qui englobe les principales étapes à suivre lors de son utilisation. Commençons tout d’abord par le processus qu’adopte Solr, dans la partie gauche, on souhaite indexer un document concernant le super héros Spiderman, identifié par un ID, un nom, un super-nom, des pouvoirs et une histoire. En dessous, est représenté Solr, dans son conteneur de servlets, se basant sur la bibliothèque Lucene. On passe donc par l'URL update, puisque c'est un ajout d'un nouveau document. Ensuite, en fonction de si le document est au format XML ou CSV (comma-separated values) un handler effectue le traitement d'analyse de la requête. Le plus souvent, c'est XML qui est utilisé. La partie de droite concerne la demande de recherche de document. On passe donc par l'URL Select, en demandant tous les superhéros qui détiennent le pouvoir d'agilité. Un handler de requête permet de traiter la recherche, et la réponse est écrite en XML, via le XML response writer. Les documents qui correspondent à la requête sont ainsi renvoyés à l'application cliente, qui peut par exemple retranscrire, le tout au format HTML pour présenter les données. 17 Figure 2: Principe de fonction d’Apache Solr Je vais procéder à l’explication des étapes du processus une par une. Pour indexer des documents, il faut tout d'abord les formater au format XML (ou CSV). Dans l'exemple ci-dessus, on considère le fichier "superheroes.xml", comportant un seul superhéro, Spider-Man : La balise <add> précise qu'on ajoute des documents. Chaque document est alors décrit entre les balises <doc>. Ici on ajoute le superhéro Spider-Man, identifié 0001, dont le nom est Peter Parker et qui comporte les pouvoirs d'agilité et la sensibilité d'une araignée. <add><doc> <field name=“id”>0001</field> <field name=“name”>Peter Parker</field> <field name=“supername”>Spider-Man</field> <field name=“powers”>agility</field> <field name=“powers”>spider sense</field> <field name=“story”>lors de sa première apparition, Peter Parker …</field> 18 </add></doc> Une fois le document rédigé, on va l'indexer en utilisant n'importe quel logiciel qui sait faire du POSTing. Solr propose dans ses exemples, un JAR qui simplifie l'ajout de documents : java -jar post.jar superheroes.xml Pour la suppression, la méthode à adopter est simple Il suffit d’une balise <delete> comme suit : <delete> <query>powers:agility</query> </delete> Pour appliquer les modifications faites au niveau du document on doit bien évidemment faire un commit qui se fait en ajoutant la balise <commit />. Concernant la recherche il suffit de passer par une requête HTTP GET. Imaginons que l'on ait au préalable indexé le document "superheroes.xml" comme vu précédemment. Le document propre à Superman est donc présent dans l'index. On demande par exemple, tous les documents comportant un champ "powers" ayant pour valeur "spider sense". C'est en effet le cas pour Spider-Man. Il suffit d'accéder à l'URL Select suivante http://localhost:8983/solr/select?q=powers:spidersense&fl=name,supername Le paramètre "fl" permet de spécifier quels sont les champs que l'on souhaite retourner pour les documents qui correspondent à la recherche. Si celui-ci n'est pas renseigné, tous les champs des documents qui correspondent seront renvoyés. Dans notre cas, on veut uniquement le nom et le supernom des héros trouvés. La réponse affichée au format XML est la suivante : <response> <lst name="responseHeader"> <int name="status">0</int> 19 <int name="QTime">0</int> <str name="q">powers:spidersens</str> </lst> <result name="response" numFound="1" start="0"> <doc> <str name="name">Peter Parker</str> <str name="supername">Spider-Man</str> </doc> </result> </response> Le statut à 0 signifie que l'opération s'est correctement déroulée. Le QTime à 0 est le temps de traitement côté serveur. On retrouve bien la requête dans le "q", en rouge. Dans cet exemple, un seul document est retourné (numFound=1). Il s'agit bien du document décrivant Spider-Man. On retrouve aussi les deux seuls champs demandés, en bleu, le nom et le super-nom. Cet exemple est donc une petite présentation des étapes suivies lors du fonctionnement de cette plate-forme de recherche partant de l’indexation jusqu’à la recherche. Les 3 principaux avantages à utiliser Solr et non pas Lucene seul sont : Le fonctionnement en mode services WEB (REST1), c’est à dire, la possibilité d’indexer et de rechercher des documents sans la moindre ligne de code si ce n’est la construction des données XML pour l’indexation et l’exploitation des données XML retournées par une recherche l’utilisation dans des applications écrites dans n’importe quel langage et permettant de communiquer en HTTP Solr étend et optimise Lucene (performances, analyseurs de texte, monitoring, …) Les fonctionnalités principales ajoutées à Lucene sont donc : 1 Configuration au moyen de fichiers XML Representational State Transfer (REST) est un style d’architecture pour les systèmes hypermédia distribués. 20 Mise en évidence des termes trouvés (Hit highlighting). Cette fonctionnalité permet de mettre en surbrillance les termes recherchés. Ce principe est le même que les pages "en cache" de Google où les termes recherchés apparaissent surlignés en jaune. C'est une fonctionnalité puissante et pratique. Navigateurs dans les résultats (Faceted search). Gestion de cache Une interface d’administration Web Architecture extensible basée sur des plugins Optimisation pour des hauts trafics Web Statistiques 21 7. Comparaison Fondamentalement, Solr est un moteur de recherche Full Text (ou texte plein en français). Nous pourrions donc utiliser un moteur open-source qui s'intègre plus facilement à notre SGBD, comme par exemple Sphinx pour les moteurs MySQL et PostgreSQL. Malheureusement, la plupart des moteurs full-text sont faibles pour la racinisation de la langue française, c'est-à-dire retrouver la racine de chaque mot et s'en servir pour effectuer les comparaisons. Solr implémente différents algorithmes de racinisation et pour un nombre de langues parfois supérieur aux autres moteurs. Malgré le nom du filtre utilisé par Solr (SnowballPorterFilter) suggérant l'exclusivité de l'algorithme Porter 2, il permet en réalité d'utiliser différents algorithmes. Il faut faire plusieurs considérations basées sur le langage de programmation et/ou sur le serveur (exemple la mémoire disponible sur la RAM). Par exemple, si la taille de la collection à indexer est très importante et à une tendance à changer (besoin fréquent d’indexation), on doit plutôt porter notre attention sur Lucene, ht://Dig ou MG4J car ils ont les meilleurs temps d’indexation. 2 C’est un algorithme de normalisation des mots. Il permet de supprimer les affixes des mots pour obtenir une forme canonique du mot. 22 Figure 3: Temps d’indexation des documents de différentes tailles (750MB, 1.GB et 2.7GB) Si par exemple la taille du disque est critique, il faudra penser à utiliser Lucene, IXE ou SwishE car la taille d’index est égale à 30% de celle de la collection, le seul inconvénient dans ce cas serait le temps d’indexation que ça prendra. Si dans un autre cas la collection ne change pas souvent et sachant que le temps de recherche est similaire chez la plupart des moteurs de recherche, on pourrait se baser sur le langage de programmation au dépend des applications dans lesquelles sera intégrer ce moteur de recherche : pour Java on peut utiliser Lucene, Terrier ou MG4J et pour C/C++ on peut utiliser Swish++, ht://Dig ou XMLSearch. 23 Je vais résumer ceci dans un tableau comparatif : Critères Moteurs de recherche Meilleurs temps d’indexation Lucene – ht://Dig – IXE – MG4J – XMLSearch – Terrier Taille des index Lucene – MG4J – IXE – XMLSearch Utilisation de la mémoire RAM Lucene – XMLSearch – ht://Dig Meilleurs temps de réponse Lucene – XMLSearch – IXE Meilleure performance d’indexation Zettair Certes, le test de performance est un art difficile. La difficulté croit avec la complexité de l'outil qu'on teste et avec le nombre de cas d'utilisation possible. Dans le cas d'un moteur de recherche, les cas d'utilisation sont extrêmement nombreux. La typologie de donnée à indexer est très variable (pages web, documents office, métadonnées), tout comme les modes d'utilisation (extranet, intranet). Le temps d'indexation est certes une métrique mais elle est de loin insuffisante pour juger de la qualité d'un moteur de recherche. Il existe aussi une plate-forme de recherche libre qui donne à Apache Solr du fil à retordre : c’est ElasticSearch. Dans le chapitre qui suit je vais essayer de comparer ces deux plates-formes pour savoir qui est plus adapté que l’autre. Dans le petit monde des moteurs de recherche, Solr était jusqu'à 2012 le moteur de recherche open source le plus complet, mais cela a quelques peu changé depuis la sortie d’ElasticSearch. Lorsque l'on parle d’ElasticSearch il est très difficile de ne pas le comparer à son grand-frère Solr (ou plus précisément SolrCloud). Ils ont beaucoup de fonctionnalités communes, seuls quelques points discriminants permettent de différencier l'un par rapport à l'autre. La grande différence entre Solr "classique" et ElasticSearch est le fonctionnement en mode distribué qui est intégré nativement dans ElasticSearch alors que cela apparait comme une extension de Solr via SolrCloud. 24 Pour la communication, les deux utilisent le protocole HTTP, mais déjà l’utilisation de ce protocole diffère avec l'intégration par défaut du XML pour la communication avec Solr et JSON pour la communication avec ElasticSearch. Du côté des données, les informations ingérées par Solr et ElasticSearch doivent être présentées comme des documents structurés. Une nouvelle différence apparaît entre les deux moteurs, car du côté de ElasticSearch les indexes sont dynamiques (dynamic mapping) et peuvent donc mélanger des documents de structures différentes ou des documents imbriqués (nested documents), ces derniers permettent d'embarquer des sous informations permettant par exemple de gérer des ACL 3 complexes par document. Elasticsearch intègre également nativement les types de données de géolocalisations permettant rapidement la gestion des résultats cartographiés (intégré depuis peu dans la version 4 de Solr). Un point fort d’ElasticSearch est l'utilisation des recherches potentielles (percolate). Cette fonctionnalité permet d'enregistrer les termes recherchés comme une recherche potentielle et par la suite d'effectuer une recherche à travers ses résultats prédéfinis plus rapidement. Ce sont des index dédiés qui sont entretenus par ElasticSearch à chaque ajout de nouveaux documents. En termes d'administration ElasticSearch peut modifier sa configuration, à la volée sans redémarrage, directement avec son API en REST/JSON. Le format des fichiers de configuration sont en YAML4 permettant d’avoir des fichiers plus concis. Là où ElasticSearch apporte un plus, est sa capacité à facilement intégrer des données externes à travers des connecteurs d'import déjà packagés appelés des « rivières ». Il y a déjà plus d'une vingtaine de rivières existantes intégrant les classiques JDBC ou LDAP, en passant par des bases de données NoSQL comme CouchDB ou MongoDB, jusqu'à des rivières plus orientées WEB comme Twitter, Dropbox ou Wikipedia. 3 Access Control List (ACL) est un système permettant de faire une gestion fine des droits d’accès aux fichiers. YAML est un format de représentation de données par sérialisation Unicode qui reprend des concepts d’autres langages comme XML. 4 25 Voici une comparaison des deux outils sous forme de tableau : API Caractéristiques Solr ElasticSearch Format XML – CSV – JSON JSON Binary API SolrJ TransportClient – Thrift Client Libraries PHP – Ruby – Perl – Scala – PHP – Ruby – Perl – Scala – Python - .NET - Javascript Python - .NET – Javascript – Erlang - Clojure Output JSON – XML – PHP – JSON - XML/HTML Python – Ruby – CSV – Velocity – XSLT - native Java INDEXATION Caractéristiques Solr ElasticSearch Data Import DataImportHandler - JDBC, Rivers modules - CouchDB, CSV, XML, Tika, URL, Flat Dropbox, DynamoDB, File FileSystem, Git, GitHub, JDBC, LDAP, MongoDB, RSS, Solr, Subversion, Twitter, Wikipedia Synonyms Oui Oui Complex documents Non Oui Online shema changes Non Oui Dynamic fields Oui Oui 26 RECHERCHE Caractéristiques Solr ElasticSearch Spatial search Oui Oui Faceting Oui Oui Spellcheck Oui Oui Autocomplete Oui Oui Joins Non Oui Result highlighting Oui Oui Result grouping Oui Non Apache Solr et ElasticSearch se basent tous les deux sur la bibliothèque Apache Lucene et fournissent des services de recherche aux APIs Java, donc les départager sera une tâche difficile car ils ont de nombreux points en communs. 27 8. Conclusion P our rendre compte de mon stage au sein de Mentat Conseil, ce rapport a procédé en plusieurs étapes. J’ai commencé par définir théoriquement, puis techniquement le concept qui constituait la problématique principale du stage, et ensuite j’ai exposé les modèles de configuration de Solr que j’ai pu élaborer pour répondre à la problématique initiale, puis les tests menés pour motiver un choix éventuel d’une de ces configurations. J’ai consacré une partie de mon stage à la comparaison des outils open source déjà présents comme a été convenu dans ma mission de stage. Le travail réalisé s’est avéré très enrichissant pour mon expérience professionnelle aussi bien en ce qui concerne le domaine technique que l’aspect humain. Le fait de travailler de près avec l’équipe qui supervise les projets menés par Mentat Conseil m’a permis d’avoir une vision détaillée de la supervision et de la gestion de projets informatiques et m’a permis de voir en quoi consistait le travail d’un ingénieur au sein d’une structure comme Mentat Conseil. 28 9. Références Bibliographiques Adresse web de la société Mentat Conseil : http://www.mentat-conseil.com/fr Documentation Intégration d’une table MySQL avec Apache Solr http://lasithtechavenue.blogspot.fr/2013/11/crawling-mysql-database-with-apache-solr.html http://www.sunilgulabani.com/2013/01/import-mysql-database-with-apache-solr.html Définitions de moteurs de recherche g-rossolini.developpez.com/tutoriels/solr/?page=introduction ged-open-source.smile.fr/Les-fonctionnalites/Moteur-de-recherche Introduction à Lucene www.eolya.fr/2008/08/06/introduction-a-lucene/ Introduction à Solr www.eolya.fr/2008/09/18/presentation-de-lucene-solr/ blog.touret.info/blog/index.php/post/2013/10/28/Premiers-pas-avec-SOLR Comparaison des moteurs de recherche www.journaldunet.com/solutions/0310/031002_pano_moteur3.shtml blog.soat.fr/2013/07/elasticsearch/ blog.smile.fr/Elasticsearch-fait-de-l-ombre-a-solr http://blog.tuquoque.com/post/2008/03/23/Comparaison-de-moteurs-de-recherche-open-source 29