Drupal
22/02/2023

Moteur de recherche et Drupal : Valeur ajoutée et configuration de Apache SolR

Illustration de la recherche difficile dans une grande quantité d'information
Plongée au coeur de la recherche sur un site Drupal utilisant Search API Solr. La première étape de ce voyage propose de mesurer la valeur ajoutée apportée par SolR et de revenir sur les principales configurations à opérer. Elles sont le fruit de nos procédures internes, synthétisées par Elie le tout puissant.

Recherche par défaut dans Drupal

Drupal propose un moteur de recherche par défaut qui pourrait être acceptable pour des recherches basiques mais qui présente de nombreuses limitations dès que nous souhaitons proposer certaines fonctionnalités de recherche avancées aux utilisateurs. Parmi elles nous signalons des difficultés pour :

  • Indexer du contenu issu des fichiers .doc, .pdf ou .pp ;
  • Paramétrer les résultats de recherche en dehors du modèle natif ; 
  • Supporter une charge élevée d'objets indexés (grande quantité de contenus).

Les membre de la communauté répertorient également les pièges à éviter lorsque nous manipulons la recherche native de drupal : 
https://www.drupal.org/docs/8/modules/search-api/getting-started/common-pitfalls

Il est pour nous important de trouver une solution alternative. Là où notre CMS ne performe pas, il s'adapte et permet de s'accoster à d'autres solutions. En matière de recherche interne, SolR tend à s'imposer comme une solution peu coûteuse et très fiable. Elle permet : 

  • Un meilleur contrôle de la recherche ;
  • La mise en cache, la réplication, la recherche distribuée ;
  • Une indexation/recherche plus rapide - les index pouvant être fusionnés ou optimisés ;
  • Une excellente interface d'administration pouvant être utilisée via HTTP.

Introduction SOLR

SolR est une plateforme API de recherche open source solide. Construit initialement pour et par CNET Networks, ce projet basé sur Java a ensuite été offert à la fondation Apache Software

Drupal Apache SolR est la meilleure solution pour des applications de recherche rapides, crédibles et impressionnantes. SolR est très fiable, évolutif et tolérant aux pannes. Il offre une indexation distribuée, une réplication et une interrogation équilibrée en fonction de la charge, un basculement et une récupération automatiques, une configuration centralisée. SolR alimente les fonctions de recherche et de navigation de nombreux sites web parmi les plus importants au monde. Des grands noms comme Netflix, Instagram et Twitter, ainsi que divers sites de commerce électronique et CMS, utilisent Apache SOLR pour leurs fonctionnalités de recherche.

SolR est alimenté par Lucene, une puissante bibliothèque de recherche plein texte open source, d’où son acronyme “Searching On Lucene with Replication”. La relation entre SolR et Lucene est comparable à celle qui existe entre une voiture et son moteur.

Valeur ajoutée de SOLR avec Drupal

Drupal SolR permet d'effectuer des recherches en texte intégral qui offrent des résultats précis grâce à ses capacités d'indexation et de recherche en temps quasi réel. L'indexation avec Drupal Apache SolR est non seulement plus rapide, mais elle peut également être fusionnée et optimisée. 

La solution offre une navigation à facettes pour permettre aux utilisateurs d'ajouter plusieurs filtres qui peuvent les aider à naviguer facilement dans des piles d'informations. Les facettes sont des éléments de navigation qui peuvent être interrogés.
Pour aller plus loin concernant les facettes et leurs configurations :

La fonction Hit Highlight (Surligner) permet de mettre en évidence les mots ou les phrases recherchés afin de les identifier facilement. La fonction de regroupement dynamique permet de regrouper les résultats de recherche et de proposer des recherches connexes ou des recommandations. En plus, il existe des processeurs qui permettent la vérification orthographique et les suggestions de complétion automatique pour une meilleure expérience de l'API de recherche.

Exigences

Il faut en premier lieu préparer et installer un serveur Apache SolR - 
https://solr.apache.org/downloads.html.

Les modules :
Search Api SolR : https://www.drupal.org/project/search_api_solr
Search Api SolR Autocomplete : https://www.drupal.org/project/search_api_autocomplete
Pour l’utilisation des facettes - Facets : https://www.drupal.org/project/facets

Puis les configurer avec le serveur SOLR préparé ▲ 
/admin/config/search/search-api
Configurer le serveur SOLR
Configurer l’index SOLR 

Représentation des données

Dans SolR, un document (qui représente le contenu) est l'unité de recherche et d'index. Un index est constitué d'un ou plusieurs documents, et un document est constitué d'un ou plusieurs champs. Dans la terminologie des bases de données, un Document correspond à une ligne de table, et un Champ correspond à une colonne de table.

Indexation SOLR

Définition

SolR collecte, stocke et indexe des documents provenant de différentes sources et les rend consultables en temps quasi réel. Il suit un processus en trois étapes qui comprend l'indexation, l'interrogation et, enfin, le classement des résultats.

En général, l'indexation est un classement systématique de documents. L'indexation permet aux utilisateurs de localiser des informations dans un document.

  • L'indexation recueille, analyse et stocke les documents ;
  • L'indexation a pour but d'augmenter la vitesse et la performance d'une requête de recherche pour trouver un document requis.

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 de valeurs séparées par des virgules (CSV), des données extraites de tables dans une base de données et des fichiers dans des formats courants tels que Microsoft Word ou PDF.

Dans Drupal, en consultant la page /admin/config/search/search-api/index/nom_indexe/edit, nous pouvons choisir la source de données désirée et configurer les types de contenu que nous voulons indexer.
 

Phase d’analyse

Lorsque les données sont ajoutées à SolR, elles subissent une série de transformations avant d'être ajoutées à l'index. C'est ce qu'on appelle la phase d'analyse. Les exemples de transformations incluent la mise en minuscule, la suppression des racines des mots (processeurs de données). Le résultat final de l'analyse est une série de “tokens” (jetons) qui sont ensuite ajoutés à l'index. Ce sont les tokens, et non le texte original, qui sont recherchés lorsque vous effectuez une requête de recherche.

Stockage des données

Lorsque nous affichons les résultats d'une recherche aux utilisateurs, ceux-ci s'attendent généralement à voir le document original, et non les tokens traités par la machine (qui peuvent avoir très peu de ressemblance avec le texte source). C'est l'objectif de l'attribut “stocké” : indiquer à SolR de stocker le texte original quelque part dans l'index.

Parfois, certains champs ne sont pas recherchés, mais doivent être affichés dans les résultats de la recherche. Pour ce faire, il suffit de définir les attributs de champ à stored=true et indexed=false. Dans Drupal, il suffit de renseigner la valeur “storage-only” dans la colonne “type” dans la page de configuration des champs de l’index (Page admin/config/search/search-api/index/nom_de_lindex_solr/fields).

Pourquoi ne pas stocker tous les champs en permanence ?
Parce que le stockage des champs augmente la taille de l'index, et plus l'index est volumineux, plus la recherche est lente. En termes de calcul physique, on pourrait dire qu'un index plus grand nécessite plus de recherches sur le disque pour atteindre la même quantité de données. Dans Drupal, nous plaçons souvent les champs de type média ou type de contenu ou même taxonomie en mode “storage-only”.

Types de données

Le schéma SolR fait référence à un fichier de configuration qui indique à SolR comment indexer et rechercher chaque champ, quels champs sont obligatoires et leurs types.

L'exemple de SolR est fourni avec un certain nombre de types de champs prédéfinis, et ils sont assez bien documentés. Vous pouvez également les utiliser comme modèles pour créer de nouveaux types de champs. La liste est présente en bas de la page /admin/config/search/search-api/index/nom_index/fields sur Drupal. 

Les plus couramment utilisés sont :

  • Texte intégral
    Les champs de texte intégral (fulltext) sont des champs analysés qui sont rendus disponibles pour la recherche de texte intégral. Ce type de données devrait être utilisé pour tous les champs (généralement avec de la saisie de texte libre par les utilisateurs) pour lesquels vous souhaitez rechercher des mots individuels. Il utilise WordDelimiterFilter pour permettre la séparation et la correspondance des mots en fonction de la casse, des limites alphanumériques et des caractères non alphanumériques, de sorte qu'une requête de "wifi" ou "wi fi" puisse correspondre à un document contenant "Wi-Fi". Les synonymes et les mots d'arrêt sont personnalisés par des fichiers externes, et la troncature est activée.
  • Champ de stockage (storage-only)
    Un champ de stockage uniquement. Vous pouvez stocker n'importe quelle chaîne de caractères et la récupérer dans l'index (dans la vue Drupal pour pouvoir l’afficher sur le site), mais vous ne pouvez pas y effectuer de recherche.
  • Chaîne de caractères (string)
    Codée UTF-8 ou Unicode, elle est utile lorsque vous avez un champ texte que vous ne voulez pas "tokeniser" (le transformer en jetons pour l’index), comme les identifiants. Il est décrit dans la documentation comme : Le type StrField n'est pas analysé, mais indexé/stocké en mot à mot. Elles ont une limite stricte de moins de 32K donc ce type est destiné aux petits champs.
  • Date
    Utile pour les dates. Le format de ce champ date est de la forme 1995-12-31T23:59:59Z, et constitue une forme plus restreinte de la représentation canonique de dateTime http://www.w3.org/TR/xmlschema-2/#dateTime.

Une fois les principes de configurations acquis et préparés, nous pouvons nous attaquer aux notions de pertinence et de boosting des résultats. Nous aborderons ces thèmes dans le prochain post consacré à la recherche SolR dans Drupal.

Références
Lucidworks.com - Scaling Lucene and Solr
bluedrop.fr - Astuce de code pour grouper des labels différents dans le tri proposé par le module facets de Drupal
bluedrop.fr - Plus loin dans search API SolR pour Drupal - la rencontre de la racinisation et de la lemmatisation
Medium - Configuring Solr for Optimum Performance
Opensenselabs.com - HowTo: Use Apache Solr with Drupal 8
SolR Apache - https://solr.apache.org/features.html
Ostraining.com - How to use Search API Solr Search in Drupal 8
Slideshare - Using Search API, Search API Solr and Facets in Drupal 8
Sematext.com - Getting Started with Apache Solr
Medium - What is an LRU Cache?
Solr Tutorial - https://www.solrtutorial.com/
Lucene Apache - Class Similarity
Lucene Apache - Class TFIDFSimilarity