- Français
- English
Configuration avancée du moteur Solr
Cette fiche explique principalement comment paramétrer l’analyse textuelle et comment améliorer le fichier de schéma pour l’accorder à ses besoins, notamment par une meilleure gestion du français.
On accède à l’administration de Solr à http://nom-du-serveur-solr:8080/solr/
Lexiques
L’analyse textuelle de Solr repose en partie sur l’utilisation de lexiques, notamment pour les “stopwords”. Généralement, les termes y sont enregistrés sous forme normalisée : sans accents ni majuscules.
Stopwords
Les stopwords sont les mots insignifiants. Un mot considéré comme insignifiant sera ignoré. Attention, certains mots ne sont insignifiants que dans certains contextes, d’autres encore ont des homonymes signifiants. Par exemple ete peut renvoyer à une saison (plutôt signifiant) ou au participe passé du verbe être (plutôt insignifiant).
Le fichier stopwords.txt ressemble à ça :
#based on stoplist from http://www.dot-seo.com/french-stop-words/ a afin ah ai aie aient aies aille ainsi ait all alla allais allait allant alle aller allerent [...]
Élisions
Les élisions sont une particularité du français, qui consistent en une contraction de mots comme le ou de quand ils sont suivis d’une voyelle. Exemple : le+avion donne l'avion. Il est possible de supprimer ces élisions à l’aide d’un lexique. En français, le lexique sera :
#Pour transformer "l'avion" en "avion" etc c d j l m n qu s t
Synonymes
Il est possible d’étendre la recherche aux synonymes s’ils sont répertoriés dans un lexique. Par exemple, pour retrouver aussi les articles contenant télévision quand on cherche avec le mot TV. Le format le plus simple pour ce fichier est du type :
television, televisions, tele, teles, tv ville, villes, commune, communes, municipalite, municipalites
Mots protégés
L’indexation utilise généralement la lemmatisation (stemming), qui consiste à réduire les mots à leur racine, par exemple “developp” pour retrouver aussi les articles contenant le mot développer quand on cherche avec le mot développement. Cependant, il arrive qu’il y ait des lemmatisations indésirables, indexant sous un même lemme deux mots qui n’ont aucun rapport. Il est possible d’empêcher la lemmatisation de certains mots en les listant dans un fichier protwords.txt.
Le schéma
Le schéma Solr (défini dans schema.xml) indique comment chaque champ est indexé. On peut le visionner de façon conviviale grâce au schema browser depuis la page d’administration du core. Le module apachesolr fournit une version de base de ce schéma adaptée à Drupal. Ce fichier définit d’abord les types de champs, puis les champs.
Les types de champs
Solr indexe différemment les différents types de champs : chaîne de caractères, booléen, nombre entier, nombre réel, date, texte,… Il est possible de définir plusieurs types de champs texte, par exemple un type qui sera indexé tel quel, pour une recherche exacte sur ce type de champ, et un autre type de champ texte qui sera normalisé, lemmatisé, etc. pour les champs nécessitant une recherche plus large ne tenant pas compte des majuscules, pluriels, etc.
Propriétés des types de champs
Pour chacun de ces types de champs, on peut définir de nombreuses propriétés dont :
- SortMissingLast : lors d’un tri basé sur ce type de champ, les contenus qui n’ont pas de valeur pour ce champ apparaîtront toujours en dernier
- SortMissingFirst : l’inverse
- OmitNorms : les normes sont utiles pour le scoring des champs texte
- Indexed : pour indexer ou non certains types de champs (indexation nécessaire pour la recherche et le tri)
Analyseurs
Surtout, on peut définir une analyse spécialisée pour ce type de champ, en lui assignant un analyzer. On peut même définir une analyse spéciale pour l’indexation, et une analyse différente pour la requête utilisateur.
Chaque analyseur est constitué d’une suite de transformateurs textuels qui peuvent être :
- un
tokenizer: découpe une chaîne entokensselon des règles particulières, le plus souvent en séparant les mots pour qu’ils soient indexés séparément (c’est ce qui permet de retrouver un texte à partir de ce mot seul). - un
charFilter: échange des caractères, par exemple supprime les accents. - un
filter: a pour but d’éliminer de l’information non-pertinente, ce qu’on appelle techniquement du “bruit”, ce qui rend la recherche plus rapide en allégeant l’index et plus pertinente en ne gardant que l’information signifiante.
Attention : l’ordre de ces transformateurs est important, chacun d’eux prenant à l’entrée le résultat de la transformation précédente et fournissant sa sortie au transformateur suivant.
Les détails de ces transformateurs sont disponibles en anglais là.
Un modèle d’analyseur du français pour le plein texte, en 12 couches
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<!-- analyseur configuré pour le français par Gaël -->
<!-- suppression d'éventuelles balises HTML-->
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<!-- découpage selon les espaces -->
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!-- suppression de la ponctuation -->
<filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
<!-- suppression des tokens vides et des mots démesurés -->
<filter class="solr.LengthFilterFactory" min="1" max="100" />
<!-- passage en minuscules -->
<filter class="solr.LowerCaseFilterFactory"/>
<!-- suppression des élisions (l', qu',...) -->
<filter class="solr.ElisionFilterFactory" articles="elisionwords.txt"/>
<!-- découpage des mots composés -->
<filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="1" splitOnNumerics="1" stemEnglishPossessive="1" generateWordParts="1"
generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
<!-- suppression des mots insignifiants -->
<filter class="solr.StopFilterFactory" ignoreCase="1" words="stopwords.txt" enablePositionIncrements="true"/>
<!-- gestion des synonymes -->
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<!-- lemmatisation (pluriels,...) -->
<filter class="solr.SnowballPorterFilterFactory" language="French" protected="protwords.txt"/>
<!-- normalisation des accents, cédilles, e dans l'o,...-->
<filter class="solr.ASCIIFoldingFilterFactory"/>
<!-- suppression des doublons éventuels -->
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
Un modèle d’analyseur pour l’index des termes français, utilisé pour la suggestion orthographique et l’auto-complétion
<fieldType name="textSpell" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<!-- analyseur configuré pour le français par Gaël -->
<!-- suppression d'éventuelles balises HTML-->
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<!-- découpage selon les espaces -->
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<!-- suppression de la ponctuation -->
<filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/>
<!-- passage en minuscules -->
<filter class="solr.LowerCaseFilterFactory"/>
<!-- suppression des élisions (l', qu',...) -->
<filter class="solr.ElisionFilterFactory" articles="elisionwords.txt"/>
<!-- limitation de la longueur des mots -->
<filter class="solr.LengthFilterFactory" min="3" max="20" />
<!-- suppression des mots insignifiants -->
<filter class="solr.StopFilterFactory" ignoreCase="1" words="stopwords.txt" enablePositionIncrements="true"/>
<!-- suppression des doublons éventuels -->
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
Les champs
Chaque champ a un type de champ (défini précédemment) et des propriétés particulières.
Propriétés des champs
Pour chaque champ, on peut là aussi définir des propriétés, dont :
- Stored : définit si les valeurs de ce champ seront stockées dans l’index Solr, donc affichables.
Copies de champs
L’idée est que pour améliorer les performances lors de la recherche, un même champ Drupal peut être indexé différemment en deux champs, ce qui crée deux index pour ce champ, par exemple un pour la recherche, et un plus léger contenant uniquement les informations nécessaires au tri.
Champs dynamiques
Cette fonctionnalité permet d’indexer des champs Drupal qui n’ont pas été spécifiquement déclarés dans le schéma. Il suffit que leur nom corresponde à l’expression régulière pour qu’ils soient créés dynamiquement avec les propriétés correspondantes.
Champs indexés par Drupal
Il est possible de savoir quels champs Drupal indexe, et comment, sur la page admin/reports/apachesolr.
Débogage de l’analyse textuelle
Pour améliorer l’analyse textuelle, le mieux est d’aller sur la page d’administration de votre core et de cliquer sur Analysis (attention, tomcat doit autoriser l’accès depuis votre machine).
Là, vous pouvez visualiser les étapes de l’analyse selon le nom du champ ou le type du champ. Vous entrez par exemple un texte dans la zone index, et une recherche d’utilisateur (généralement un mot ou une série de mots) dans la zone requête. Ce qui vous permettra de voir si la recherche permettra de trouver un document contenant ce texte dans le champ.
Une manière de vérifier que Solr n’indexe pas massivement des données inutiles est d’entrer une url du type http://192.168.1.7:8080/solr/core-name/admin/luke?wt=xslt&tr=luke.xsl. On visualise par la même occasion la façon dont ont été indexés chacun des champs.
La configuration de Solr
La configuration du moteur proprement dit se fait dans le fichier solrconfig.xml. Le module apachesolr fournit une version qui devrait convenir. On peut modifier modifier certaines options de “bas-niveau”, relatives aux mises à jour automatiques d’index, au cache, à l’interface d’administration,… Il s’agit notamment de limitations destinées à éviter une surcharge du serveur.
Une description détaillée de ce fichier est disponible ici.
Post new comment