L'outil de recherche Solr est accessible via le ribbon dans l'onglet Accueil, catégorie Outils, ou via le panneau de critère de la plupart des outils de recherche classiques où il est possible de basculer sur les recherches avancées et les recherches Solr.
Ce type de recherche est destiné uniquement à des utilisateurs avertis. Elle permet de construire des recherches très avancées et possède sa propre syntaxe. Les critères, opérateurs de comparaison, opérateurs logiques, colonnes et facettes sont libres. La principale restriction est la sélection d'au moins un type de contenu.
Voici les différents points qui seront abordés dans ce document :
L'outil est composé de plusieurs zones, les points 1 à 5 correspondent à la création de la requête de recherche, et la zone 6 correspond aux résultats de recherche.
L'auto-complétion (Ctrl + Espace) est disponible à tous les niveaux de l'outil de recherche Solr. Il est vivement conseillé d'en user et en abuser.
La sélection du type de contenu (ou du rôle) permet de dessiner un contexte principal qui servira à définir quels champs seront disponibles à l'auto-complétion pour les autres zones du panneau des critères de recherche.
L'opérateur utilisé entre les différents types ou rôles sélectionnés est l'opérateur de choix "OR". De ce fait, si plusieurs types de contenu ou rôles sont sélectionnés, l'auto-complétion se limitera au type de contenu commun le plus élevé entre toutes les valeurs sélectionnées. Par exemple, si dans les types de contenu, l'utilisateur sélectionne les tables de référence de l'offre de formation "Période" et "Domaine", seuls les champs venant du type de contenu commun à ses deux types seront utilisables (dans ce cas, ce sont les champs provenant du type "Table de référence ODF"). A défaut d'avoir un type de contenu commun, seuls les champs standard sont disponibles.
La recherche sur les rôles et types de contenu n'est pas stricte, c'est à dire qu'elle tient compte des héritages. Par exemple, dans l'offre de formation, tous les types de contenus héritent du type de contenu "Contenu ODF". Si ce type est sélectionné, tous les contenus ayant un type de contenu héritant de "Contenu ODF" seront remontés : ELP, Liste d'ELP, formation, etc.
Pour construire une requête, il est nécessaire de connaître la syntaxe globale d'une requête : opérateurs de comparaison et opérateurs logiques notamment. Mais cela n'est pas suffisant, il faut aussi comprendre le fonctionnement des suffixes ajoutés au nom des champs. L'auto-complétion sera d'une grande aide pour bien construire une requête.
Vous pouvez ensuite aller plus loin en faisant des requêtes jointées permettant de faire des recherches profondes.
Par défaut, le requêteur est rempli avec la valeur suivante :
*:*
Celle-ci permet de renvoyer tous les résutats sans aucun filtre.
Le séparateur entre un champ et une valeur est ":".
title:histoire
title est le nom du champ et histoire est la valeur recherchée.
Une expression exacte doit être mise entre guillemets.
title:"Licence Histoire"
Il est possible de faire des intervalles de valeurs fermés ou ouverts, le séparateur entre les deux valeurs est le mot clef "TO".
Les crochets ("[" et "]") permettent d'inclure les valeurs des bornes.
Les accolades ("{" et "}") permettent au contraire d'exclure les bornes.
Une extrémité de l'intervalle peut être ouverte et l'autre fermée.
Filtre sur le champ "annee" dont la valeur est comprise entre 2008 et 2018 mais ne peut être égale à 2008 ou 2018 :
annee:{2008 TO 2018}
Filtre sur le champ "annee" dont la valeur est inférieure ou égale à 2018 :
annee:[* TO 2018]
Filtre sur le champ "annee" dont la valeur est strictement supérieur à 2008 :
annee:{2008 TO *]
Grâce aux intervalles, il est également possible de tester si un champ est renseigné :
annee:[* TO *]
Il existe classiquement 3 opérateurs logiques :
Les opérateurs de négation déduisent une partie d'un ensemble de résultats. Il faut donc que la clause précédente exprime les résultats auxquels nous voulons appliquer la clause de négation. C'est pour cette raison que nous préfèrerons l'écriture de cette clause avec "-".
Il est important de séparer les groupes par des parenthèses ("(" et ")"), en particulier quand les opérateurs changent. Il peut être malin d'isoler chaque clause dans des parenthèses également.
Comme nous pouvons le voir dans la liste ci-dessus, il existe plusieurs manières d'écrire un groupe de clauses, nous pouvons utiliser la notation complète (AND, OR, NOT) ou abrégée (+, (vide), -). Les deux notations peuvent être mélangées.
Ces deux requêtes sont équivalentes (tous les contenus ayant pour titre "histoire" et pour description "art") :
(title:histoire) AND (description:art) +(title:histoire) +(description:art)
Comme les trois qui suivent et qui mélangent les notations (tous les contenus ayant pour titre "histoire" et ayant un niveau mais n'ayant pas "archéologie" comme description) :
((title:histoire) AND (level:[* TO *])) -(description:archéologie) ((title:histoire) AND (level:[* TO *])) NOT(description:archéologie) (+(title:histoire) +(level:[* TO *])) NOT(description:archéologie)
Il est important de constater que l'opérateur négatif est toujours précédé d'un contexte. Si nous voulons obtenir tous les contenus dont le titre n'est pas "histoire", il faudra écrire ceci :
*:* -(title:histoire)
Les opérateurs logiques peuvent également être utilisés dans les valeurs :
title:(+histoire -art) title:(histoire AND art) title:((histoire OR géographie) AND master)
Les recherches se font par termes exacts, mais il est possible d'ajouter des jokers à celles-ci. Il en existe de différents types et voici les principales :
"?" remplace un caractère inconnu
L'expression suivante renvoie aussi bien tous les contenus dont le titre est "route", "roule", "rouge", etc. :
title:rou?e
Celle-ci renvoie les contenus dont le titre est identique aux mots cités précédemment mais aussi des mots plus long ou plus courts comme "roue", "roulade", "rougie", etc. :
title:rou*e
Cette nouvelle expression renvoie les contenus dont le titre est approchant à un caractère prêt comme "bouge", "route", "ronge", etc. :
title:rouge~1
Il est aussi possible de définir la distance maximale entre deux termes. Dans cette expression, Solr nous renvoie les contenus dont le titre contient les mots "licence" et "histoire" avec une distance maximale de 10 caractères entre les deux termes.
title:"licence histoire"~10
Pour aider au tri des résultats par pertinence, la syntaxe des expressions Solr offre la possibilité d'ajouter des poids, appelés "boost", et représentés par le caractères "^".
(title:histoire)^1.5 OR (description:histoire)
Ici, les résultats dont le titre est "histoire" seront plus pertinents que ceux dont la description est "histoire".
Un champ présent dans Ametys peut être indexé de différentes manières dans Solr. Il est toujours suffixé, mis à part les champs standard. Ci-dessous, nous pouvons retrouver la liste des différents suffixes utilisés lors de l'indexation des données et qui devront donc être utilisés pour construire vos requêtes.
Chaque champ Solr peut être multivalué.
Le nom de base du champ est représenté par [fieldName].
Syntaxe |
Commentaire |
Exemple |
---|---|---|
Chaîne de caractères (string) | ||
[fieldName]_s |
Comparaison exacte (casse et accents pris en compte) |
title_s:Géographie |
[fieldName]_s_lower |
Recherche sur la valeur du champ en minuscules |
title_lower_s:géographie |
[fieldName]_txt_fr | Recherche full-text (terme par terme, casse et accents ignorés) |
title_txt_fr:GEOgraphie |
Champs simples | ||
[fieldName]_l |
Entier (long) |
duree_l:20 |
[fieldName]_d |
Nombre décimal (double) |
etcs_d:15 |
[fieldName]_b |
Booléen (vrai/faux) |
openToExchangeStudents_b:true |
[fieldName]_dt |
Date (datetime, valeurs au format ISO) |
startDate_dt:2018-12-20T00:00:00.000Z |
Champs complexes | ||
[fieldName]_s | Contenu (comparaison sur l'identifiant) | degree_s:"content://a52db23d-fbf2-42a6-98b4-384d3914aeb0" |
[fieldName]_txt_stemmed_fr | Texte riche | presentation_txt_stemmed_fr:geographie |
[composite]/[fieldNameWithSuffix] | Champ composé | pilotage/pilotage_status_s:CFVU_VALIDATED |
[fieldName]_geo | Coordonnées géographiques (distance en kilomètres) | {!geofield sfield=geoCode_geo pt=45.62,-0.12 d=10} |
Champs standard | ||
contentLanguage | Langue du contenu | contentLanguage:fr |
workflowStep | Etat du workflow (long) | workflowStep:3 |
creator | Créateur du contenu (login#population) | creator:bmaurel#cms-users |
contributor | Dernier contributeur (login#population) | contributor:bmaurel#cms-users |
creationDate | Date de création | creationDate:2018-12-20T00:00:00.000Z |
lastModified | Date de dernière modification | lastModified:2018-12-20T00:00:00.000Z |
lastValidation | Date de dernière validation | lastValidation:2018-12-20T00:00:00.000Z |
full_fr | Recherche dans tous les textes, textes riches et documents du contenu (pas d'auto-complétion) | full_fr:psychologie |
Recherche full-text
En full-text, chaque mot du champ est recherché de façon indépendante contrairement aux autres types de recherches où c'est la valeur complète qui est recherché. Ainsi, il est possible de rechercher sur un ou plusieurs mots du champ.
Coordonnées géographiques
La syntaxe présentée ci-dessus pour les coordonnées géographiques n'est pas disponible dans l'auto-complétion mais peut tout de même être utilisée dans le requêteur Solr.
Paramètres :
> sfield est le champ sur lequel on effectue la recherche
> pt permet de définir une coordonnée géographique de départ
> d est le rayon de recherche en kilomètres autour de ce point
Champs standard (aussi appelés champs systèmes)
Tous les champs systèmes ne sont pas présentés ici, certains champs sont disponibles uniquement avec certains plugins, il n'est donc pas pertinent d'en faire une liste exhaustive.
Ils sont visibles via auto-complétion et ne sont pas suffixés. Leur type est noté entre parenthèses dans l'auto-complétion, il suffit donc de s'y référer et de les traiter comme n'importe quel champ mais sans suffixe.
Pour faire des expressions prenant en compte des valeurs contenues dans des repeaters ou des contenus liés, il existe les requêtes jointées.
Elles sont accessibles via l'auto-complétion directement en tapant le nom du champ du repeater, mais pas pour les contenus liés. Cependant, le mot clef "join" permet de construire automatiquement la syntaxe d'une requête jointée :
{!ametys join= q=""}
Celle-ci est composée de deux paramètres :
{!ametys join=internshipDescription q="period_l:4"}
Cette expression permet de rechercher tous les contenus dont la période de stage se déroule au moi d'avril.
Il existe une autre manière d'écrire les clauses de restriction en utilisant des crochets ("[" et "]") pour y mettre la clause :
{!ametys join=internshipDescription[period_l:4]}
Enfin, pour faire des jointures à plusieurs niveaux, il suffit d'utiliser "->" pour explorer les champs.
Pour rechercher les responsables d'une formation dont le nom commence par "a" :
{!ametys join=personInCharge->persons q="givenName_txt_fr:a*"}
Il est possible de mélanger les clauses entre crochets et les clauses dans le paramètre q par exemple pour rechercher toutes les personnes dont le rôle est "responsable" et dont le nom commence par "a" :
{!ametys join=personInCharge[role_s:responsable]->persons q="givenName_txt_fr:a*"}
A tous les niveaux des jointures, l'auto-complétion reste disponible en prenant bien en compte le contexte courant.
Les valeurs affichées dans les colonnes et facettes des résultats de recherche sont extraites directement du contenu et non du serveur d'indexation. C'est pour cela qu'il n'y a pas de suffixe aux noms des champs comme dans les requêtes Solr.
Les champs sélectionnés sont séparés par des virgules.
Pour faire une recherche en profondeur (exploration d'un champ complexe (composite, repeater, contenu)), il est nécessaire d'utiliser le séparateur "." entre chaque niveau.
Le libellé affiché pour chacun des éléments colonne ou facette est par défaut le libellé du champ dans Ametys.
Ce champ représente la liste des colonnes affichées dans les résultats de recherche.
Une colonne peut être renommée pour avoir un nom plus explicite ou plus complet grâce au mot clef "AS".
Si ce champ est laissé vide, ce sont les colonnes "Titre", "Date de création", "Dernière modification", "Dernier contributeur", "Créateur", "Etat", "Langue", "Type(s) de contenu" et "Rôle(s) strict(s)" qui sont affichées.
Pour afficher les colonnes "Titre", "Code" (de la nature de l'ELP) et "Volume horaire" :
title, courseType.code, nbHours
Cependant, pour être plus précis sur le titre de la deuxième colonne, il est possible de faire ceci, ainsi nous aurons les colonnes "Titre", "Nature" et "Volume horaire" :
title, courseType.code AS Nature, nbHours
Le symbole "*" a également été intégré afin d'afficher toutes les champs du contenu :
*
Il est possible d'aller plus loin en n'affichant que les champs d'un contenu lié ou d'un champ composé (multiple ou non), par exemple en affichant le titre, le détail des composantes et le détail de l'illustration d'une formation :
title, orgUnit.*, illustration.*
Les facettes permettent de faire des filtres rapides et dynamiques sur les valeurs d'un champs, ainsi il est facilement possible de filtrer des contenus selon des valeurs de champs standard (type de contenu, langue, état de workflow, orphelin, etc.) ou du modèle (nature, catalogue, etc.). Elles sont pré-calculées au moment de la requête.
Dans cet élément, seuls les champs ayant un nombre de valeurs limité peuvent être sélectionnés. Ce sont les champs énumérées, les contenus, les utilisateurs et les booléens. Par exemple, il est impossible d'avoir une facette sur le titre (title). Si une donnée avec des valeurs non limitées est choisie, elle sera ignorée.
Dans l'exemple suivant fait sur le type de contenu de l'offre de formation "ELP", seul les facettes "Catalogue" et "Contributeur" sont calculées :
catalog, courseType.code, contributor, title
Mais il est possible d'afficher la facette "Nature" car elle est elle-même un contenu ou une sous-donnée limitée de celle-ci :
catalog, courseType, contributor, courseType.contributor
Si ce champ est laissé vide, aucune facette n'est calculée.