Les concepts de Solr
Apache Solr est une plateforme open-source de recherche d'entreprise construite sur Apache Lucene. Il permet d'indexer et de rechercher de grandes quantités de données rapidement et efficacement. Voici les concepts clefs de Solr :
- Document : Un document est l'unité de base d'informations dans Solr. Il contient des champs, chacun ayant un nom et une valeur. Les documents sont indexés et recherchés dans Solr. Un document peut représenter une entité comme un article, un produit, un enregistrement,...
- Champ (Field) Un champ est une composante d'un document. Chaque champ a un type de données (texte, date, nombre,...) et des caractéristiques spécifiques (comme s'il est indexé, entreposé ou en jeton). Par exemple, un document "article" pourrait avoir des champs comme "titre", "auteur", "contenu", et "date".
- Core : Un core est une instance indépendante dans Solr contenant son propre index et son propre ensemble de configurations. Une installation Solr peut contenir plusieurs core, chacun gérant une collection de documents distincte. Cela permet de segmenter différentes applications ou types de données au sein d'une même instance Solr.
- Collection : Une collection est un ensemble logique de documents dans un environnement distribué. Dans SolrCloud (mode distribué de Solr), une collection est divisée en plusieurs shards étant répliqués pour la tolérance aux pannes.
- Schéma : Le schéma définit la structure des documents dans une collection ou un core. Il spécifie les champs disponibles, leurs types, et les règles sur la manière dont les données sont indexées et stockées. Le schéma peut être statique (défini à l'avance) ou dynamique (champs ajoutés à la volée).
- Sharding : Le sharding est la méthode de division d'une collection en plusieurs fragments ou "shards" pour la répartition de la charge et l'amélioration des performances. Chaque shard contient une partie des données de la collection, et les recherches peuvent être distribuées sur plusieurs shards.
- Réplique (Replica) : Une réplique est une copie d'un shard dans SolrCloud. Les répliques sont utilisées pour la tolérance aux pannes et la haute disponibilité. Si un shard tombe en panne, ses répliques peuvent continuer à servir les requêtes.
- Index : L'index est la structure de données que Solr utilise pour effectuer des recherches rapides. Il contient les termes extraits des documents et leurs positions, facilitant ainsi une recherche rapide. L'index est construit à partir des documents étant ajoutés à Solr.
- Requête (Query) Une requête est une demande faite à Solr pour récupérer des documents en fonction de critères de recherche. Les requêtes peuvent être simples (mot-clef) ou complexes (utilisant des filtres, des opérateurs booléens,...). Solr supporte des requêtes textuelles, des requêtes d'intervalle (range queries), et bien d'autres.
- Analyseur (Analyzer) Un analyseur est une composante transformant le texte brut en termes indexables. Cela peut impliquer la conversion en minuscules, la suppression des stop words, les jetons, et l'application de filtres de synonymes. Les analyseurs sont essentiels pour améliorer la précision des recherches.
- Faceting Le faceting est une technique permettant de générer des résumés des résultats de recherche sous forme de catégories. Par exemple, dans une recherche de produits, les facettes peuvent inclure des catégories comme la marque, le prix, et la disponibilité. C'est un outil puissant pour la navigation et l'affinage des résultats.
- SolrCloud : SolrCloud est la version distribuée de Solr permettant de gérer de grandes quantités de données et de servir des requêtes avec haute disponibilité et tolérance aux pannes. Il s'appuie sur ZooKeeper pour la gestion des configurations et le suivi de l'état de l'unité d'allocation.
- ZooKeeper : ZooKeeper est un système de gestion de configuration et de coordination distribué utilisé par SolrCloud. Il entrepose les informations de configuration, les états des shards et des répliques, et permet la coordination entre les noeuds dans un environnement Solr distribué.
- Réplication : La réplication est le processus de copie des données d'un core ou d'un shard vers une ou plusieurs répliques pour assurer la redondance et l'équilibrage de la charge.
Documents, champs et conception de schémas
Le principe fondamental de Solr est simple. Vous lui donnez beaucoup d'informations, puis vous pouvez lui poser des questions et trouver l'information que vous souhaitez.
La partie où vous introduisez toutes les informations s'appelle l'indexation ou la mise à jour. Lorsque vous posez une question, cela s'appelle une requête. Une façon de comprendre le fonctionnement de Solr est de penser à un livre de recettes à feuillets mobiles. Chaque fois que vous ajoutez une recette au livre, vous mettez à jour l'index à la fin. Vous répertoriez chaque ingrédient et le numéro de page de la recette que vous venez d'ajouter. Supposons que vous ajoutiez cent recettes. À l'aide de l'index, vous pouvez très rapidement trouver toutes les recettes utilisant des pois chiches, des artichauts ou du café comme ingrédient. L'utilisation de l'index est beaucoup plus rapide que de parcourir chaque recette une par une. Imaginez un livre de mille recettes, ou d'un million.
Solr vous permet de créer un index avec de nombreux champs ou types d'entrées différents. L'exemple ci-dessus montre comment créer un index avec un seul champ, les ingrédients. Vous pouvez avoir d'autres champs dans l'index pour le style de cuisson de la recette, comme asiatique, cajun ou végétalien, et vous pouvez avoir un champ d'index pour les temps de préparation. Solr peut répondre à des questions telles que «Quelles recettes de style cajun contenant des oranges sanguines comme ingrédient peuvent être préparées en moins de 30 minutes ?»
Le schéma est l'endroit où vous indiquez à Solr comment il doit créer des index à partir des documents d'entrée.
Comment Solr voit le monde
L'unité d'information de base de Solr est un document, étant un ensemble de données décrivant quelque chose. Un document de recette contiendrait les ingrédients, les instructions, le temps de préparation, le temps de cuisson, les outils nécessaires,... Un document sur une personne, par exemple, pourrait contenir le nom de la personne, sa biographie, sa couleur préférée et sa pointure. Un document sur un livre pourrait contenir le titre, l'auteur, l'année de publication, le nombre de pages,...
Dans l'univers Solr, les documents sont composés de champs, étant des informations plus spécifiques. La pointure de chaussure pourrait être un champ. Le prénom et le nom de famille pourraient être des champs.
Les champs peuvent contenir différents types de données. Un champ de nom, par exemple, est du texte (données de caractères). Un champ de pointure de chaussure peut être un nombre à virgule flottante, de sorte qu'il peut contenir des valeurs telles que 6 et 9,5. Bien entendu, la définition des champs est flexible (vous pouvez définir un champ de pointure comme un champ de texte plutôt qu'un nombre à virgule flottante, par exemple), mais si vous définissez correctement vos champs, Solr sera en mesure de les interpréter correctement et vos utilisateurs obtiendront de meilleurs résultats lorsqu'ils effectueront une requête.
Vous pouvez indiquer à Solr le type de données qu'un champ contient en spécifiant son type de champ. Le type de champ indique à Solr comment interpréter le champ et comment il peut être interrogé.
Lorsque vous ajoutez un document, Solr prend les informations des champs du document et ajoute ces informations à un index. Lorsque vous effectuez une requête, Solr peut rapidement consulter l'index et renvoyer les documents correspondants.
Analyse de champ
L'analyse de champ indique à Solr ce qu'il doit faire des données entrantes lors de la création d'un index. Un nom plus précis pour ce processus serait traitement ou même digestion, mais le nom officiel est analyse.
Prenons par exemple un champ de biographie dans un document personnel. Chaque mot de la biographie doit être indexé afin que vous puissiez rapidement trouver des personnes dont la vie a eu quelque chose à voir avec le ketchup, les libellules ou la cryptographie.
Cependant, une biographie contiendra probablement beaucoup de mots ne vous intéressant pas et que vous ne voulez pas voir encombrer votre index, comme des mots comme «le», «un», «à»,... De plus, supposons que la biographie contienne le mot «Ketchup», en majuscule au début d'une phrase. Si un utilisateur effectue une requête pour «ketchup», vous voulez que Solr vous parle de la personne même si la biographie contient le mot en majuscule.
La solution à ces deux problèmes est l'analyse de champ. Pour le champ de biographie, vous pouvez indiquer à Solr comment décomposer la biographie en mots. Vous pouvez indiquer à Solr que vous souhaitez mettre tous les mots en minuscules et vous pouvez lui demander de supprimer les accents.
L'analyse de champ est une partie importante d'un type de champ. L'analyse de document dans Solr est une description détaillée de l'analyse de champ.
Fichier de schéma de Solr
Solr entrepose les détails sur les types de champs et les champs qu'il est censé comprendre dans un fichier de schéma. Ce fichier est nommé soit managed-schema.xml, soit schema.xml. La différence est déterminée par la façon dont vous prévoyez de gérer le schéma de Solr dans votre installation : soit par programmation, soit en le modifiant manuellement.
Un fait important à propos du schéma est qu'il s'agit d'un concept Solr. Les données réelles de votre index sont entreposées dans Lucene, et Lucene n'a pas le concept de schéma. Cela signifie que les modifications apportées au fichier de schéma n'auront aucun impact sur les données déjà entreposées dans l'index. En fait, modifier le schéma sans réindexer vos données peut entraîner de graves problèmes avec l'index, au point que la seule solution soit de réindexer entièrement vos données.
Il est recommandé d'essayer de réfléchir aux données que vous prévoyez d'indexer : de quel type de données s'agit-il ? Comment souhaitez-vous pouvoir les rechercher ? Comment les champs des documents seront-ils affichés aux utilisateurs ?
Si vous n'êtes pas encore sûr, prévoyez quelques tests d'indexation pour voir comment les données de vos documents sont indexées avec les paramètres par défaut. Prévoyez dans votre plan d'implémentation un temps d'itération et commencez petit. Plus vous serez en mesure de définir votre schéma avant d'indexer tous vos documents, plus vous aurez de chances de réussir votre application de recherche pour vos utilisateurs.
Indexation Solr
Cette section décrit le processus d'indexation : ajouter du contenu à un index Solr et, si nécessaire, modifier ce contenu ou le supprimer.
En ajoutant du contenu à un index, nous le rendons consultable par Solr. Un index Solr peut accepter des données provenant de nombreuses sources différentes, notamment des fichiers XML, des fichiers CSV (valeurs séparées par des virgules), des données extraites de tables dans une base de données et des fichiers dans des formats de fichiers courants tels que Microsoft Word ou PDF.
Voici les trois méthodes les plus courantes pour charger des données dans un index Solr :
- Indexation avec Solr Cell et Apache Tika, basé sur Apache Tika pour l'ingestion de fichiers binaires ou de fichiers structurés tels qu'Office, Word, PDF et d'autres formats propriétaires.
- Téléchargement de fichiers XML en envoyant des requêtes HTTP au serveur Solr à partir de n'importe quel environnement où de telles requêtes peuvent être générées.
- Écriture d'une application Java personnalisée pour ingérer des données via l'API client Java de Solr (étant décrite plus en détail dans API client). L'utilisation de l'API Java peut être le meilleur choix si vous travaillez avec une application, telle qu'un système de gestion de contenu (CMS), proposant une API Java.
Quelle que soit la méthode utilisée pour ingérer des données, il existe une structure de données de base commune pour les données introduites dans un index Solr : un document contenant plusieurs champs, chacun avec un nom et contenant du contenu, pouvant être vide. L'un des champs est généralement désigné comme un champ d'ID unique (analogue à une clef primaire dans une base de données), bien que l'utilisation d'un champ d'ID unique ne soit pas strictement requise par Solr.
Si le nom du champ est défini dans le schéma associé à l'index, les étapes d'analyse associées à ce champ seront appliquées à son contenu lorsque le contenu est en jeton. Les champs n'étant pas explicitement définis dans le schéma seront soit ignorés, soit cartographiés à une définition de champ dynamique, s'il en existe une correspondant au nom du champ.
Le répertoire d'exemples Solr
Lors du démarrage de Solr avec l'option «-e», le répertoire example/ sera utilisé comme répertoire de base pour les exemples d'instances Solr étant créés. Ce répertoire comprend également un sous-répertoire example/exampledocs/ contenant des exemples de documents dans divers formats que vous pouvez utiliser pour expérimenter l'indexation dans les différents exemples.
L'utilitaire curl pour le transfert de fichiers
De nombreuses instructions et exemples de cette section utilisent l'utilitaire curl pour transférer du contenu via une URL. curl publie et récupère des données via HTTP, FTP et de nombreux autres protocoles. La plupart des distributions Linux incluent une copie de curl. Vous trouverez des téléchargements curl pour Linux, Windows et de nombreux autres systèmes d'exploitation sur http://curl.haxx.se/download.html.
L'utilisation de curl ou d'autres outils de ligne de commande pour publier des données est tout à fait appropriée pour les exemples ou les tests, mais ce n'est pas la méthode recommandée pour obtenir les meilleures performances pour les mises à jour dans les environnements de production. Vous obtiendrez de meilleures performances avec Solr Cell ou les autres méthodes décrites dans cette section.
Au lieu de curl, vous pouvez utiliser des utilitaires tels que GNU wget ou gérer les GET et les POST avec Perl, bien que les options de ligne de commande soient différentes.
Recherche dans Solr
Solr propose un ensemble riche et flexible de fonctionnalités de recherche. Pour comprendre l'étendue de cette flexibilité, il est utile de commencer par un aperçu des étapes et des composantes impliqués dans une recherche Solr.
Lorsqu'un utilisateur exécute une recherche dans Solr, la requête de recherche est traitée par un gestionnaire de requêtes. Un gestionnaire de requêtes est un plugiciel Solr définissant la logique à utiliser lorsque Solr traite une requête. Solr prend en charge une variété de gestionnaires de requêtes. Certains sont conçus pour traiter les requêtes de recherche, tandis que d'autres gèrent des tâches telles que la réplication d'index.
Les applications de recherche sélectionnent un gestionnaire de requêtes particulier par défaut. En outre, les applications peuvent être configurées pour permettre aux utilisateurs de remplacer la sélection par défaut par un autre gestionnaire de requêtes.
Pour traiter une requête de recherche, un gestionnaire de requêtes appelle un analyseur de requêtes, interprétant les termes et les paramètres d'une requête. Différents analyseurs de requêtes prennent en charge différentes syntaxes. L'analyseur de requêtes par défaut de Solr est connu sous le nom d'analyseur de requêtes standard, ou plus communément, d'analyseur de requêtes «lucene». Solr inclut également l'analyseur de requêtes DisMax et l'analyseur de requêtes DisMax étendu (eDisMax).
La syntaxe de l'analyseur de requêtes standard permet une plus grande précision dans les recherches, mais l'analyseur de requêtes DisMax est beaucoup plus tolérant aux erreurs. L'analyseur de requêtes DisMax est conçu pour offrir une expérience similaire à celle des moteurs de recherche populaires tels que Google, affichant rarement les erreurs de syntaxe aux utilisateurs. L'analyseur de requêtes DisMax étendu est une version améliorée de DisMax gérant la syntaxe de requête Lucene complète tout en tolérant les erreurs de syntaxe. Il inclut également plusieurs fonctionnalités supplémentaires.
De plus, il existe des paramètres de requête communs acceptés par tous les analyseurs de requêtes.
Les données d'entrée d'un analyseur de requête peuvent inclure :
- Des chaînes de recherche, c'est-à-dire des termes à rechercher dans l'index.
- Des paramètres permettant d'affiner la requête en augmentant l'importance de chaînes ou de champs particuliers, en appliquant une logique booléenne entre les termes de recherche ou en excluant du contenu des résultats de recherche.
- Des paramètres permettant de contrôler la présentation de la réponse à la requête, comme la spécification de l'ordre dans lequel les résultats doivent être présentés ou la limitation de la réponse à des champs particuliers du schéma de l'application de recherche.
Les paramètres de recherche peuvent également spécifier une requête de filtre. Dans le cadre d'une réponse de recherche, une requête de filtre exécute une requête sur l'ensemble de l'index et met en cache les résultats. Étant donné que Solr alloue un cache distinct pour les requêtes de filtre, l'utilisation stratégique des requêtes de filtre peut améliorer les performances de recherche.
Malgré leurs noms similaires, les filtres de requête ne sont pas liés aux filtres d'analyse. Les requêtes de filtre exécutent des requêtes au moment de la recherche sur les données déjà présentes dans l'index, tandis que les filtres d'analyse, tels que les jetons, analysent le contenu pour l'indexation, en suivant des règles spécifiées.
Une requête de recherche peut demander que certains termes soient mis en surbrillance dans la réponse de recherche ; c'est-à-dire que les termes sélectionnés seront affichés dans des cases colorées afin qu'ils «sautent» sur l'écran des résultats de recherche. La mise en surbrillance peut faciliter la recherche de passages pertinents dans de longs documents renvoyés lors d'une recherche. Solr prend en charge la mise en surbrillance de plusieurs termes. Solr comprend un ensemble complet de paramètres de recherche pour contrôler la manière dont les termes sont mis en surbrillance.
Les réponses de recherche peuvent également être configurées pour inclure des extraits de document contenant du texte mis en surbrillance.
Pour aider les utilisateurs à se concentrer sur le contenu qu'ils recherchent, Solr prend en charge deux méthodes spéciales de regroupement des résultats de recherche pour faciliter une exploration plus approfondie : le facettage et l'unité d'allocation.
Le facettage consiste à organiser les résultats de recherche en catégories (basées sur des termes indexés). Dans chaque catégorie, Solr indique le nombre de résultats pour le terme pertinent, ce que l'on appelle une contrainte de facette. Le facettage permet aux utilisateurs d'explorer facilement les résultats de recherche sur des sites tels que les sites de films et les sites d'évaluation de produits, où il existe de nombreuses catégories et de nombreux éléments au sein d'une catégorie.
Le facettage utilise des champs définis lors de l'indexation des applications de recherche.
L'unité d'allocation regroupe les résultats de recherche en fonction des similitudes découvertes lors de l'exécution d'une recherche, plutôt que lors de l'indexation du contenu. Les résultats de l'unité d'allocation manquent souvent de l'organisation hiérarchique soignée que l'on trouve dans les résultats de recherche à facettes, mais l'unité d'allocation peut néanmoins être utile. Il peut révéler des points communs inattendus entre les résultats de recherche et aider les utilisateurs à exclure le contenu n'étant pas pertinent par rapport à ce qu'ils recherchent réellement.
Solr prend également en charge une fonctionnalité appelée MoreLikeThis, permettant aux utilisateurs de soumettre de nouvelles requêtes se concentrant sur des termes particuliers renvoyés dans une requête précédente. Les requêtes MoreLikeThis peuvent utiliser le facettage ou l'unité d'allocation pour fournir une aide supplémentaire aux utilisateurs.
Un composante Solr appelé rédacteur de réponse gère la présentation finale de la réponse à la requête. Solr comprend une variété de rédacteurs de réponse, notamment un rédacteur de réponse XML et un rédacteur de réponse JSON.
Pertinence
La pertinence est le degré auquel une réponse à une requête satisfait un utilisateur recherchant des informations.
La pertinence d'une réponse à une requête dépend du contexte dans lequel la requête a été effectuée. Une même application de recherche peut être utilisée dans différents contextes par des utilisateurs ayant des besoins et des attentes différents. Par exemple, un moteur de recherche de données climatiques peut être utilisé par un chercheur universitaire étudiant les tendances climatiques à long terme, un agriculteur souhaitant calculer la date probable du dernier gel du printemps, un ingénieur civil intéressé par les régimes de précipitations et la fréquence des inondations, et un étudiant prévoyant des vacances dans une région et se demandant quoi emporter. Étant donné que les motivations de ces utilisateurs varient, la pertinence de toute réponse particulière à une requête variera également.
Dans quelle mesure les réponses à une requête doivent-elles être complètes ? Comme la pertinence en général, la réponse à cette question dépend du contexte d'une recherche. Le coût de la non-recherche d'un document particulier en réponse à une requête est élevé dans certains contextes, comme une recherche de découverte électronique juridique en réponse à une assignation à comparaître, et assez faible dans d'autres, comme une recherche de recette de gâteau sur un site Web contenant des dizaines ou des centaines de recettes de gâteau. Lors de la configuration de Solr, vous devez évaluer l'exhaustivité par rapport à d'autres facteurs tels que la rapidité et la facilité d'utilisation.
Les exemples de découverte électronique et de recette démontrent l'importance de deux concepts liés à la pertinence :
- La précision est le pourcentage de documents pertinents dans les résultats renvoyés.
- Le rappel est le pourcentage de résultats pertinents renvoyés sur tous les résultats pertinents du système. Obtenir un rappel parfait est trivial : il suffit de renvoyer chaque document de la collection pour chaque requête.
Pour revenir aux exemples ci-dessus, il est important qu'une application de recherche de découverte électronique ait un taux de rappel de 100 % pour tous les documents pertinents pour une assignation aux résultats. Il est toutefois beaucoup moins important qu'une application de recette offre ce degré de précision. Dans certains cas, renvoyer trop de résultats dans des contextes informels pourrait submerger les utilisateurs. Dans certains contextes, renvoyer moins de résultats ayant une probabilité plus élevée de pertinence peut être la meilleure approche.
En utilisant les concepts de précision et de rappel, il est possible de quantifier la pertinence entre les utilisateurs et les requêtes pour un ensemble de documents. Un système parfait aurait une précision de 100 % et un taux de rappel de 100 % pour chaque utilisateur et chaque requête. En d'autres termes, il récupérerait tous les documents pertinents et rien d'autre. En termes pratiques, lorsqu'on parle de précision et de rappel dans des systèmes réels, il est courant de se concentrer sur la précision et le rappel à un certain nombre de résultats, le plus courant (et le plus utile) étant dix résultats.
Grâce au facettage, aux filtres de requête et à d'autres composants de recherche, une application Solr peut être configurée avec la flexibilité nécessaire pour aider les utilisateurs à affiner leurs recherches afin de renvoyer les résultats les plus pertinents pour les utilisateurs. Autrement dit, Solr peut être configuré pour équilibrer la précision et le rappel afin de répondre aux besoins d'une communauté d'utilisateurs particulière.
La configuration d'une application Solr doit prendre en compte :
- Les besoins des différents utilisateurs de l'application (pouvant inclure la facilité d'utilisation et la rapidité de réponse, en plus des besoins strictement informatifs)
- Les catégories étant significatives pour ces utilisateurs dans leurs différents contextes (par exemple, les dates, les catégories de produits ou les régions)
- Toute pertinence inhérente des documents (par exemple, il peut être judicieux de s'assurer qu'une description officielle du produit ou une FAQ est toujours renvoyée en haut des résultats de recherche)
- Si l'âge des documents est important ou non (dans certains contextes, les documents les plus récents peuvent toujours être les plus importants)
En gardant tous ces facteurs à l'esprit, il est souvent utile, lors des étapes de planification d'un déploiement Solr, d'esquisser les types de réponses que vous pensez que l'application de recherche doit renvoyer pour les exemples de requêtes. Une fois l'application opérationnelle, vous pouvez utiliser une série de méthodologies de test, telles que des groupes de discussion, des tests internes, des tests TREC et des tests A/B pour affiner la configuration de l'application afin de répondre au mieux aux besoins de ses utilisateurs.