Présentation de Solr et elasticsearch

Solr et elasticsearch sont deux solutions d’indexation et de recherche plein-texte (full-text). Ces outils présentent les mêmes caractéristiques de bases pour répondre aux mêmes besoins. Bien sur, ils se distinguent par certains fonctionnalités et choix technologiques qui font que l’on s’orientera vers l’un ou l’autre, mais cet article n’est qu’une introduction de base.

Il s’agit donc de moteurs de recherche open-source très performants qui permettent l’indexation de données textuelles et d’attributs divers (titre, auteur, date de publication, description, …) dans différentes langues. Ce ne sont pas des outils que l’on met à disposition d’utilisateurs tels que peuvent l’être Google ou Bing. Au même titre que des bases de données comme MySQL ou Mongodb (NoSQL), ce sont des outils que l’on intègre dans des applications existantes ou au dessus desquels sont développées des interfaces de recherche.

Moteurs de recherche performants signifie qu’ils sont capables d’indexer en batch ou en temps réel des millions ou des milliards d’éléments correspondants à des giga-octets ou des tera-octet de données et qu’ils peuvent répondre à plusieurs centaines de requêtes à la secondes en quelques dixièmes de secondes seulement. Pour atteindre de telles performances et une très haute disponibilité de service, il peut être nécessaire de les configurer en cluster de plusieurs serveurs au travers desquels seront réparties les index et les requêtes.

Apache Lucene le socle commun

Un élément fondamental qui explique la similitude de Solr et elasticsearch est que les deux outils s’appuient sur un socle commun : Apache Lucene.

Apache Lucene est une librairie Java open-source d’indexation et de recherche plein-texte qui existe depuis le début des années 2000. Lucene fournit les mécanismes de base d’indexation et de recherche. De leur coté, Solr et elasticsearch  apportent des aspects techniques qui en fond de véritables solutions d’entreprise :

  • Fourniture de Web service
  • Optimisation de la mémoire (cache)
  • Haute disponibilité
  • Interface d’administration et de monitoring

Fonctionnalités

Voici la liste des fonctionnalité de bases que l’on retrouve dans Solr et elasticsearch :

  • Indexation et recherche en fonction de la langue (découpage des mots, mots-vides, synonymes, élisions, …)
  • Recherche par termes, par expressions, par requêtes booléennes en utilisant des wildcards
  • Tri par pertinence
  • Recherche et filtrage par facettes
  • Recherche spatiale
  • Suggestion de requêtes en cours de frappe (suggester)
  • Correction orthographique (spellcheck)
  • Recherche phonétique
  • Recherche par similarité (more like this search)
  • Mise en évidence dans les résultats des termes de la requête (highlighting)
  • Indexation de texte brut mais également de documents dans des formats variés (PDF, Office, …)
  • Mise en cluster des résultats
  • Interface d’administration et de monitoring

Performances et haute-disponibilité

En terme de performance, on parle potentiellement de millions voir milliards de données indexées et de centaines de recherches à la seconde.

Pour une application de taille raisonnable avec quelques millions de données indexées pour une volumétrie de quelques dizaines de giga-octet et une dizaine de requêtes par seconde, un serveur unique avec des caractéristiques raisonnables (quadri-core et 8Go de RAM) est souvent suffisant. Par contre pour des volumétries plus importantes et de la haute disponibilité, il est nécessaire de mettre en place un cluster de plusieurs noeuds Solr ou elasticsearch.

Une telle configuration permet de découper les index en shards (sous index) et de répliquer chacun de ces shards une ou plusieurs fois (on parle de replica). Plus le nombre et le volume de données indexées est important plus on divise l’index en shard. Plus le nombre de requêtes est important, plus on réplique les shards. Un index découpé en shards eux même répliqués est communément appelé une collection. Cela donne une organisation matricielle des éléments de la collection comme indiqué dans ce schéma.

solrcloud3

Collection sous forme d’une matrice

Il est donc possible d’augmenter la taille du cluster en fonction des besoins (ajout de collections, volume de données croissant, volume de requêtes croissant) et ceci sans interruption de service.

Lors de la création de collections de tailles variées (nombre de shards et de replicas) au sein du cluster, Solr et elasticsearch gèrent la répartition des sous éléments des collections afin de les répartir au mieux au sein du cluster et avoir ainsi des noeuds équilibrés pour obtenir des performances optimales. Voici une illustration basée sur un cluster SolrCloud.

solrcloud2

Organisation des collections dans un cluster Solrcloud

Si Solr et elasticsearch présentent quelques différences en terme de fonctionnalités, c’est surtout dans les choix techniques mis en oeuvre pour gérer le fonctionnement sous forme de cluster et la communication des noeuds entre eux qu’ils diffèrent. Solr s’appuie sur Zookeeper qui a pour role de centraliser les configurations et de communiquer l’état du cluster à chaque noeud, alors qu’elasticsearch est autonome et ne nécessite pas l’utilisation et l’installation d’un outil tiers.

C’est souvent ce point précis qui fait dire qu’elasticsearch est plus simple à mettre en oeuvre que Solr. Cependant, ce qui parait comme un avantage au premier abord peut devenir un inconvénient par la suite lors de problèmes ponctuel de communication entre les noeuds du cluster.

Intégration et API

Solr et elasticsearch fournissent des API de type Web Service (RESTFull), tant pour l’indexation, la recherche que l’administration (gestion des collection et monitoring).

Des API existent pour différents langages de programmation tels que Java, PHP, Python, …

Conclusion

Cet article est une présentation rapide des outils Solr et elasticsearch. Cependant, il est l’introduction indispensable à des articles de mise en oeuvre plus techniques.