SlideShare une entreprise Scribd logo
1  sur  110
Thomas Francart,
SolR
Moteur de recherche
open-source pour l’entreprise
Thomas Francart,
Ces supports sont la propriété intellectuelle de Thomas FRANCART et ne
sauraient être réutilisés sans la permission écrite de leur auteur
(thomas.francart@sparna.fr)
Thomas Francart,
La problématique
Thomas Francart,
Information Retrieval (IR)
« trouver de l’information
(en général des documents)
non-structurée
(en général du texte)
qui répond à une intention de
recherche, dans une large
collection
(en général numérisée) »
Thomas Francart,
Thomas Francart,
SELECT * FROM post
WHERE
topic LIKE ‘%keyword%’
OR author LIKE ‘%keyword%’
ORDER BY id DESC
Thomas Francart,
Les SGBD ne sont pas adaptés
pour faire de la recherche plein-
texte
• Comment fait-on pour les recherches
avec plusieurs termes ? sur plusieurs
tables ?
• Full table scan = mauvaise performances
• Pas de scoring des résultats
• Gestion des langues, des recherches
approchantes (pluriels, féminins, etc.)
Thomas Francart,
Chaque problème
à sa solution
(chaque solution a aussi ses problèmes)
Thomas Francart,
Données
Processus
d’indexation
Moteur de recherche
Recherche dans
l’index
Mise à jour de
l’index
Index
Application
requête
réponse
Données Données
Thomas Francart,
• Open-source, écrit en Java;
• Serveur de recherche autonome à
déployer dans un container J2EE;
• Basé sur Lucene, une librairie java de
recherche plein-texte;
Thomas Francart,
• La « couche basse » de SolR : une librairie
Java pour écrire et rechercher dans les
fichiers d’index;
• Un index contient des documents
• Un document contient des champs (« fields »)
• Un field contient des termes (« terms »)
• SolR expose les fonctionnalités de Lucene
dans un serveur, au travers de HTTP;
Thomas Francart,
SolR : historique
• Développé au sein de CNET par Yonik Seeley
• Transféré à la fondation Apache en 2006;
• Incubé jusqu’en 2007 : v1.2;
• Aujourd’hui, Lucene et SolR sont dans le même
projet Apache, et releasés ensemble;
– On est donc passé directement de SolR 1.4 à 3.0 pour
que les n° de version correspondent
• Juin 2013 : v4.3.1
• Grosse communauté d’utilisateurs
• Lucid Imagination : support commercial
Thomas Francart,
Et l’utilisateur alors ?
• SolR s’arrête à fournir un flux de réponse en
XML
• SolR ne propose _pas_ d’interface utilisateur de
recherche
• Pour cela, on peut utiliser des librairies
d’intégration en fonction du langage
• Voir http://wiki.apache.org/solr/IntegratingSolr
– Java : SolRJ http://wiki.apache.org/solr/Solrj
– Javascript : ajax-SolR
http://wiki.github.com/evolvingweb/ajax-solr
– Ruby : http://projectblacklight.org/
– PHP, .Net, etc…
Thomas Francart,
Qu’est-ce qu’un index ?
• Chaque document a
un id et est associé à
une liste de termes
• Pour chaque terme, on
garde la liste des id de
documents qui
contiennent ce terme
Thomas Francart,
Recherche plein-texte
« SolR browse », interface de recherche d’exemple fournie par SolR
Thomas Francart,
Surbrillance des résultats
Human Right Watch : http://www.hrw.org/search
Thomas Francart,
Recherche à facettes
World Bank : http://openknowledge.worldbank.org
Thomas Francart,
Suggestions et corrections
UNESCO IIEP (International Institute for Educational Planning) :
http://plan4learning.iiep.unesco.org
Thomas Francart,
Recherche sur synonymes
Jobtransport : http://jobtransport.com
Thomas Francart,
Recherche spatiale
Thomas Francart,
Salissons-nous
les mains…
Premières manipulations avec SolR
Thomas Francart,
1, 2, 3 !
• Télécharger, dézipper
• Lancer :
cd <solr>/example
java –jar start.jar
• Indexer les documents de test
cd <solr>/example/exampledocs
java -jar post.jar *.xml
• Rechercher
http://localhost:8983/solr (interface d’admin)
Thomas Francart,
SolR admin et les statistiques
Thomas Francart,
SolR admin : recherche
Thomas Francart,
SolR Browse
(…/solr/collection1/browse)
Thomas Francart,
Entr’ouvrons le capot…
• Répertoire de travail de SolR
(« solr.home ») :
<solr>/example/solr
• Configuration des cœurs :
<solr.home>/solr.xml
• Données :
<solr.home>/<core>/data
• Configuration :
<solr.home>/<core>/conf
Thomas Francart,
Entr’ouvrons le capot…
• Configuration de la structure de l’index (le
fichier le plus important !)
<solr.home>/<core>/conf/schema.xml
• + tous les autres fichiers de ce répertoire
• Listes des mots vides par langue
<solr.home>/<core>/conf/lang
• Configuration des gestionnaires de réponse (=
configuration du serveur)
<solr.home>/<core>/conf/solrconfig.xml
• Feuilles de style de formats de réponses
<solr.home>/<core>/conf/xslt
• Templates pour l’interface « browse » :
<solr.home>/<core>/conf/velocity
Thomas Francart,
schema.xml
• « field », « dynamicField », « uniqueKey »
définissent la structure d’un document
dans l’index
• « copyField » duplique automatiquement
les valeurs d’un champ dans un autre
• « fieldType » déclare un type de champs
possible pour un « field »
– Contient un ou parfois deux « analyzer »
• « analyzer » définit les traitements qui
seront appliqués aux valeurs du field, à
l’indexation et à la recherche
Thomas Francart,
Le copyField
• Un index est fait pour rechercher
– Vs. pour stocker
• Il doit être construit :
– En fonction des données
– En fonction des recherches qui seront faites
dessus
• Il est normal de dupliquer certaines valeurs
dans certains champs de configuration
différentes pour répondre à différents besoins
de recherche
– Ex : copier une chaine vers un field
« phonetique » sur lequel portera la recherche
phonétique
Thomas Francart,
Un field
name : son nom;
type : son type, une référence à fieldType;
multivalued : si un document peut avoir
plusieurs valeurs pour ce champ;
required : si la valeur est obligatoire
(SolR renverra une erreur si on insère un document sans valeur pour ce
field)
indexed : si on veut pouvoir chercher ou trier
sur les valeurs de ce champs;
stored : si on veut ramener les valeurs de ce
champs dans un résultat de recherche;
Thomas Francart,
Indexed et Stored
On peut avoir des champs qui ne
servent qu’à rechercher sans
jamais être ramenés dans un résultat
de recherche.
Inversement, on peut avoir des champs
qui ne servent qu’à être ramenés
dans un résultat de recherche et sur
lesquels on ne cherchera jamais.
Thomas Francart,
Un fieldType
name : son nom (référencé dans un field);
class: sa classe Java (1 classe = 1 type de
données)
(dans ce fichier, « solr… » est un raccourci pour « org.apache.solr.analysis »)
• Quelques types de données :
– solr.BoolField : booléen
– solr.TrieIntField/solr.TrieLongField : entiers
– solr.TrieFloatField : décimaux
– solr.TrieDateField : date
– solr.LatLonType : latitude/longitude
– solr.CurrencyField : monnaie
– solr.TextField : texte
Thomas Francart,
Tokenizer
et filters :
l’analyse
du texte
par Lucene
Thomas Francart,
Un exemple de flux d’analyse
position 1 2 3 4 5 6
term text école primaire
bcdiV2.0 v
2
0
bcdi bcdiv
20
bcdiV20
position 1 2 3 4 5 6
term text école primaire
bcdiV2.0 V
2
0
bcdi bcdiV
20
bcdiV20
position 1 2 3
term text école primaire bcdiV2.0
RemoveDuplicatesTokenFilterFactory
SnowballPorterFilterFactory
ISOLatin1AccentFilterFactory
StopFilterFactory
LowerCaseFilterFactory
WordDelimiterFilterFactory
WhitespaceTokenizerFactory
position 1 2 3 4 5 6
term text ecole primaire
bcdiV2.0 v
2
0
bcdi bcdiv
20
bcdiV20
position 1 2 3 4 5 6
term text ecol primair
bcdiV2.0 v
2
0
bcdi bcdiv
20
bcdiV20
Texte de départ : « école primaire bcdiV2.0 »
Thomas Francart,
L’interface d’analyse
Thomas Francart,
Pratique : comprendre l’analyse
• Testez l’analyse sur la chaine « Une formation
débutant sur SolR »
– Avec le type de champ text_ws
– Avec le type de champ text_general
– Avec le type de champ text_fr
– Que constatez-vous ?
– Lisez les commentaires associés à ces types de
champs dans schema.xml
• Mettez une query dans le champ query, par
exemple « se former sur SolR »
– Que constatez-vous ?
• Avec le type de champ « string »
• Essayez avec :
– « Administration Apache, l’essentiel »
Thomas Francart,
Un analyzer
Mission : analyser les valeurs texte d’un fieldType
de classe solr.Text, soit au moment de
l’insertion d’une valeur, soit au moment de la
recherche d’une valeur.
Un fieldType de classe solr.Text a :
– Un analyzer pour le texte indexé (type=« index »)
– Un analyzer pour le texte de la query (type=« query »)
– (ils sont souvent très similaires)
– Si un seul analyzer est paramétré sans type=« … », il est
utilisé pour l’indexation _et_ la recherche
Un analyzer se compose, dans l’ordre, de :
– un charFilter (jamais utilisé)
– un tokenizer (obligatoire)
– une liste de filter
Thomas Francart,
Un analyzer
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt“ />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true“ />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Thomas Francart,
Un tokenizer
Mission : découper la chaine de caractères
en tokens
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#Tokenizer
Factories
Plusieurs possibilités :
– WhitespaceTokenizerFactory
– StandardTokenizerFactory
– PatternTokenizerFactory
– PathHierarchyTokenizerFactory
– KeywordTokenizerFactory
– (et d’autres)
Thomas Francart,
Tokenizer : Quelques possibilités
• WhitespaceTokenizer
– Découpe sur les espaces, tabulations, sauts de ligne
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
• StandardTokenizer
– Espaces et ponctuation. Marche pour toutes langues européennes.
A utiliser par défaut.
<tokenizer class="solr.StandardTokenizerFactory"/>
• KeywordTokenizer
– Aucune tokenization ! Utile pour les valeurs à stocker telles quelles
<tokenizer class="solr.KeywordTokenizerFactory"/>
• PatternTokenizerFactory
– Découpe en fonction d’une expression régulière
Thomas Francart,
Un filter
• Mission : prendre un token en entrée,
cracher 0, 1 ou n tokens en sortie
(souvent différents du token d’entrée)
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#TokenFilt
erFactories
Thomas Francart,
Filter : Stopwords
• Format du fichier : un terme par ligne
a
à
et
un
• A mettre dans à l’index ET à la query
• solr.KeepWordFilterFactory : inverse de
stopWords
• Utiliser schema browser dans l’admin pour
avoir le top 10 des termes les plus fréquents
• Expérimenter avec le champ « text_fr »
– Ajouter des stopwords
<filter class="solr.StopFilterFactory" ignoreCase="true"
words="stopwords.txt" enablePositionIncrements="true" />
Thomas Francart,
Filter : Stemming
• Stemming : ramener les formes fléchies à
un radical (différent du lemme)
– Pluriels, féminins, conjugaisons
– « cheval », « chevaux » => « chev »
– « portera », « porterait » => « porte »
• Plusieurs algorithmes possibles
• A mettre dans à l’index ET à la query
• Expérimenter avec le champ « text_fr »
– Changer le filtre de stemming en
décommentant
Thomas Francart,
Filter : Synonyms
• Format du fichier des synonymes :
– Possibilité 1 :
GB,gib => gigabyte
« n’importe quelle valeur à gauche de la flèche sera remplacée par toutes
les valeurs à droite de la flèche »
– Possibilité 2 :
GB,gib,gigabyte,gigabytes
• Si expand="true", tous les termes sont équivalents, et la ligne est
équivalente à :
GB,gib,gigabyte,gigabytes => GB,gib,gigabyte,gigabytes
• Si expand="false", toute la ligne se ramène au premier synonyme, et la
ligne est équivalente à :
GB,gib,gigabyte,gigabytes => GB
• Expérimenter avec le champ « text_fr »
– Ajouter des synonymes
<filter class="solr.SynonymFilterFactory"
synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
Thomas Francart,
Synonymes :
index-time ou query-time ?
• Les synonymes peuvent être utilisés au
moment de l’indexation ou au moment
de la query
• Il est conseillé de les utiliser au moment
de l’indexation
– question de performance
– problèmes liés aux synonymes comportant
plusieurs mots à la query
• Un travail est en cours dans SolR pour
améliorer la gestion des synonymes à la
query
Thomas Francart,
Recherche phonétique
• A mettre à l’index ET à la query
• Plusieurs algorithmes possibles
– Caverphone, Metaphone, DoubleMetaphone,
etc.
– DoubleMetaphone donnerait de meilleurs
résultats même en dehors de l’anglais
• Attention, peut donner des résultats
hasardeux
• A utiliser dans un champ dédié
<filter class="solr.DoubleMetaphoneFilterFactory"
inject="false"/>
Thomas Francart,
Autres filters
• LowerCaseFilterFactory
– Met tout en minuscule. A utiliser quasi-
systématiquement, à l’index ET à la query
• ASCIIFoldingFilterFactory
– Supprime l’accentuation. A utiliser à l’index ET à
la query
• LengthFilterFactory
– Pour ne garder que les tokens d’une certain taille
• PatternReplaceFilterFactory
– Pour faire du rechercher-remplace dans les
tokens
• http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
Thomas Francart,
Indexer des
données
Thomas Francart,
Thomas Francart,
Formats d’input pour SolR
• XML
– Cas le plus fréquent, API SolR
• JSON
– Même structure que le XML, mais sérialisées en
JSON
• Javabin
– Données binaires utilisées par SolrJ
• CSV
• Documents riches (Word, PDF, etc.)
– Avec extraction possible des métadonnées
• Un SGBD
– Avec le DataImportHandler
Thomas Francart,
Le format XML : add
• Toutes les bibliothèques clients SolR que vous trouverez s’appuient sur
ce format pour l’indexation des données
• A soumettre dans un appel HTTP POST à une URL de SolR
• Inutile d’envoyer les valeurs pour des fields remplis automatiquement
avec un copyField
<add overwrite="true">
<doc>
<field name="id">5432a</field>
<field name="type">Album</field>
<field name="name">Murder Ballads</field>
<field name="artist">Nick Cave</field>
<field name="release_date">2012-07-31T09:40:00Z</field>
</doc>
<doc boost="2.0">
<field name="id">myid</field>
<field name="type">Album</field>
<field name="name">Ilo veyou</field>
<!-- etc. -->
</doc>
</add>
Thomas Francart,
Le format XML
• Overwrite
– Basé sur le champ uniqueKey
– Mettre à false si on est sûr de n’envoyer
que des nouveaux record
• Boost
– Le document sortira plus haut dans les
résultats que les autres
Thomas Francart,
Le format XML : delete
• Pour supprimer tout l’index, il faut
mieux supprimer le répertoire data et
relancer SolR
<delete>
<id>5432a</id>
<id>monId</id>
</delete>
<delete>
<query>Artist:"Nick Cave"</query>
</delete>
<delete>
<query>*:*</query>
</delete>
Thomas Francart,
Le format XML : commit
• Commits :
– Lents : donc faire un seul gros commit à la fin
– Pas de transactions par clients (commit global)
• Optimize : committe et optimise l’index
• Aucune de ces opérations ne bloque la recherche
• Un commit ou un optimize peuvent aussi se faire en
envoyant le paramètre ?commit=true dans l’URL
http://localhost:8983/solr/collection1/update?commit=true
<commit />
<rollback />
<optimize />
Thomas Francart,
Le format CSV
• …/solr/core/update/csv à la place de
…/solr/core/update
• Les noms des colonnes du CSV doivent correspondre au
noms des fields
• Ce format est le seul qui soit le même en input et en
output de query
• On pourrait donc faire une query dans un SolR en demandant
un résultat CSV et réinjecter ce résultat dans un autre SolR
• Options possibles dans l’URL :
• separator : séparateur à utiliser (‘,’ par défaut)
• header=true : indique que la première ligne est une ligne
d’entête
• fieldnames=field1,field2 : indique le nom des fields à utiliser si
le CSV ne contient pas d’entête
• overwite=false : si on n’est sur qu’on n’overwrite rien
Thomas Francart,
Le format CSV
• Options possibles dans l’URL (suite) :
• skipLines=1000 : si on veut sauter des lignes
• skip=field1,field2 : si certaines colonnes ne
doivent pas être importées
• escape= caractère d’échappement pour
échapper le séparateur dans les valeurs
• encapsulator=" : indique le caractère qui
entoure les valeurs de champs qui contiennent le
séparateur
• Voir http://wiki.apache.org/solr/UpdateCSV
pour les autres options
Thomas Francart,
Rechercher
Thomas Francart,
XML d’un résultat de recherche
Entête
Résultats
• numFound : nombre
total de résultats
• start : offset de début
Thomas Francart,
Format XML générique
• Même format dans le XML de résultat
et dans solrconfig.xml
– <arr> : un tableau
– <lst> : une liste dont tous les éléments on
un attribut « name »
– <str>, <int>, <long>, <float>, <double>,
<bool>
– <date> : format ISO-8601
• 1965-1-30T05:00:00Z
Thomas Francart,
Décoder l’URL
• Faire la requete suivante dans SolR admin :
– Titre_en:education
– Start=0 et rows=20
• Comprendre l’URL
– /solr/formation : nom du core
– /select : le RequestHandler interrogé
– Paramètres (encodés avec %) :
• q : notre query
• start et rows : pagination
• wt : serialisation XML
• indent : indique qu’on veut indenter le résultat
Thomas Francart,
Un exemple réel de requête
http://localhost:8389/core01/select/?q=primaire&start=0&rows=50&fl=*+score&
qt=dismax&qf=label_fr^1+description_fr^0.4+label2_fr^0.4+description^0.6+no
tesAbb^0.4+notes^0.4+introduction_fr^0.3+publicCode^0.3+openCategory1^0.
4+openCategory2^0.4+openCategory3^0.4+openCategory4^0.4+filename2^0.
1+urlDir2^0.1&facet=true&facet.mincount=1&facet.limit=5&facet.field=label_fr
&facet.field=introduction_fr&facet.field=label_fr_rayon&facet.field=openCatego
ry1&hl=on&hl.fl=description,label_fr,notesAbb,label2_fr&hl.highlightMultiTerm=
true&spellcheck=true&spellcheck.extendedResults=true&spellcheck.collate=tr
ue&spellcheck.onlyMorePopular=true&spellcheck.count=5&sort=score+desc&
hl.fragsize=200&debugQuery=on
Thomas Francart,
Un RequestHandler
• Ouvrir le fichier conf/solrconfig.xml
• Chercher le requestHandler « /select »
<requestHandler name="/select"
class="solr.SearchHandler">
<!-- default values for query parameters can be
specified, these will be overridden by parameters in
the request -->
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>
</lst>
<!-- ... -->
</requestHandler>
Thomas Francart,
Un RequestHandler
• Configure un type de recherche (ou
d’update)
– Indique des paramètres par défaut
– Indique quels composants de recherche
utiliser (« components »)
• Recommendation : configurer un
RequestHandler par type de recherche
dans votre application
• Chercher le RequestHandler « /browse »
pour voir sa longue liste de paramètres
Thomas Francart,
Appeler un RequestHandler
• Il y a 2 façons d’appeler un
RequestHandler :
1. Soit à l’URL /select avec le paramètre
« qt » (pour « queryType ») contenant le
nom du requestHandler
2. Soit en appelant l’URL correspondant au
nom du RequestHandler
http://localhost:8389/core01/select/?q=primaire&qt=myRequestHandler
http://localhost:8389/core01/myRequestHandler?q=primaire
Thomas Francart,
RequestHandler : liste
« defaults »
• La liste « defaults » donne les valeurs
des paramètres qui seront utilisées si
aucune valeur n’est précisée
explicitement dans la query
<requestHandler name="/myHandler" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<!-- etc... -->
</lst>
<!-- ... -->
</requestHandler>
Thomas Francart,
RequestHandler : liste
« appends »
• La liste « appends » donne les valeurs
des paramètres qui seront ajoutées
aux paramètres multivalués de la
query (comme fq)
<requestHandler name="/myHandler" class="solr.SearchHandler">
<lst name="appends">
<str name="fq">a_type:group</str>
<!-- etc... -->
</lst>
<!-- ... -->
</requestHandler>
Thomas Francart,
RequestHandler : liste
« invariants »
• La liste « invariants » donne les valeurs
des paramètres qui seront toujours
utilisés, quelque soit les valeurs indiqués
dans la query (utile pour sécuriser les
requestHandler)
<requestHandler name="/myHandler" class="solr.SearchHandler">
<lst name="invariants">
<str name="facets">false</str>
<!-- etc... -->
</lst>
<!-- ... -->
</requestHandler>
Thomas Francart,
Les « components » de
recherche
• Un « component » exécute une
fonctionnalité de recherche : highlight,
facettes, MLT, etc.
• Chaque « component » est déclaré
dans une section de solrconfig.xml
<searchComponent class="solr.HighlightComponent" name="highlight“>
<highlighting>
<!-- etc... -->
</highlighting>
</searchComponent>
Thomas Francart,
RequestHandler : array
« components »
• Un RequestHandler se compose d’une liste de
« components »
• Il y a une liste de components par défaut,
défini dans l’array « components »
• Si on redéfini un array nommé
« components », on overwrite les composants
par défaut
<requestHandler name="/myHandler" class="solr.SearchHandler">
<arr name="components">
<str>query</str>
<str>facet</str>
<str>mlt</str>
<str>highlight</str>
<str>stats</str>
<str>debug</str>
</arr>
</requestHandler>
Thomas Francart,
RequestHandler : array « first-
components » et « last-components »
• On peut ajouter un composant de
recherche au début ou à la fin de la
liste par défaut avec « first-
components » et « last-components »
<requestHandler name="/myHandler" class="solr.SearchHandler">
<arr name="last-components">
<str>elevator</str>
</arr>
</requestHandler>
Thomas Francart,
Paramètres de recherche
communs
• La query :
q (query) query de recherche
fq (filterQuery) queries de filtrage (~ WHERE SQL)
defType le parser de query (lucene ou edismax)
• Pagination
rows Nombre de résultats
start Offset de départ de la liste
• Output :
fl (fieldList) Champs à remonter
sort Critère de tri
wt (writer type) Format de la réponse
• Diagnostic :
indent Indentation du résultat
echoParams Ce que SolR a compris de la recherche
debugQuery votre ami pour le tuning
Thomas Francart,
Le paramètre df
• « df » (= « default field ») indique le field
cherché par défaut (ici : « text »)
• Mais notre schéma ne contient pas de
champ « text » !
• Ajoutons-le
• Remplissons-le avec des « copyField » :
– titre_en, titre_fr, resume, motcle, pays, auteur
• Reindexons les données
• Tester la requête « education » (vs.
« titre_en:education »
Thomas Francart,
Paramètres de recherche
communs
• Expérimenter dans l’interface d’admin
– Q=education et fq=« pays:France » vs. q=«education
AND pays:France »
– Activer « debugQuery » pour voir ce que SolR a compris
de la requête
– fl:titre_en,titre_fr pour ne ramener que les titres
– Jouer avec start et rows pour paginer
– Essayer wt=json pour avoir du JSON plutôt que du XML
Thomas Francart,
Le score et le tri
• Field spécial « score »
– on peut le ramener avec le paramètre
« fl=score »
• « sort » se fait sur ce pseudo-champ
« score » par défaut
• Tester avec sort=titre_en pour trier par
ordre alphabétique des titres
Thomas Francart,
Syntaxe de recherche
• La syntaxe dépend du parser de query
(paramètre defType)
– Lucene
– Ou dismax ou edismax
• Le parser « lucene » est le plus précis et
permet de combiner des critères sur tous
les champs
– mais une « search box » dans une interface
est toujours branchée sur un
defType=edismax qui est plus simple pour du
plein-texte
Thomas Francart,
Syntaxe de recherche Lucene :
clauses
• *:* matche tous les documents
• Une recherche est un ensemble de clauses :
– education : clause optionnelle
– +education : clause obligatoire
– -education : clause interdite
• Indiquer un field spécifique pour une clause :
– pays:France
• Combiner les clauses :
– AND / && : +education AND pays:france
– OR / || : +education OR pays:france
• Parenthesage
– (education AND teacher) OR (quality AND plan)
• (+education +teacher) (+quality +plan)
• différent de +(education teacher) +(quality plan)
Thomas Francart,
Syntaxe de recherche Lucene :
phrase et wildcard
• « Phrase query » :
– quality education vs. « quality education »
• Proximité des mots
– « quality education »~3
• Wildcard queries
– educat*
– In*tion –innovation
– Innova????
– *tion
– Attention : lent (il faut configurer un field
spécial pour cela)
Thomas Francart,
Syntaxe de recherche Lucene :
fuzzy, range, boost
• Fuzzy queries
– auteur:ewing vs. auteur:ewing~ vs.
auteur:ewing~0.8
• Range queries
– education AND annee:[1999 TO 2001]
– education AND annee:[2001 TO *]
• Score boosting
– Child primary^10
Thomas Francart,
Mr « Eddy Smax » (edismax)
• edismax vs. lucene :
– Cherche dans plusieurs fields en même
temps
– Query par defaut
– + Nombre minimum de mots à matcher
– + Smart boosting (proximity)
• Activer edismax avec le paramètre
– defType=« edismax »
Thomas Francart,
Edismax : paramètres
• qf : query fields
– children education
– titre_en^10 resume^2 vs. titre_en^2
resume^10
• q.alt : alternative query
– Souvent *:*
• mm : min should match
– Config avancée, voir
http://wiki.apache.org/solr/DisMaxQParserPlu
gin#mm_.28Minimum_.27Should.27_Match.29
Thomas Francart,
Pratique : reparamétrer le
handler /browse
• Commentez toutes les parties pas nécessaires
:
– Mlt
– Facets
– highlight
– Spellcheck
– Conserver seulement les parties
« VelocityResponseWriter » et « Query settings »
– Ajuster le paramètre qf
• Copier les nouveaux templates Velocity dans
le sous-répertoire « velocity » pour
correspondre à notre schéma
Thomas Francart,
Le spellcheck
Corrections orthographiques
Thomas Francart,
Spellcheck : configuration du
schema
• « Voulez-vous dire… ? »
• Les suggestions orthographiques doivent
se baser sur un dictionnaire :
– Un fichier texte
– Ou bien les valeurs d’un champ de l’index
(recommandé)
• En général, un champ spécifiquement dédié à
cela et rempli via des copyField
• stored=false
• Pas de stemming
• lowercasing
Thomas Francart,
Spellcheck : configuration du
component
• Le component « spellcheck » existe déjà dans
solrconfig.xml. Ses options :
– name : un nom de configuration
– classname : solr.DirectSolrSpellchecker ou
solr.IndexBasedSpellChecker, ou solr.FileBasedSpellChecker
• solr.DirectSolrSpellchecker ne demande aucun rebuild, à préférer
– spellcheckIndexDir : répertoire de stockage du
dictionnaire, relatif à solr/data
– buildOnCommit et buildOnOptimize : quand optimiser
l’index
– accuracy : entre 0 et 1; plus c’est haut, plus les corrections
proposées seront proches des mots initiaux (défaut : 0.5)
– distanceMeasure : algorithme de calcul de distance à
utiliser
– fieldType : type de field à utiliser pour analyser la query à
vérifier dans le paramètre spellcheck.q
Thomas Francart,
Spellcheck : configuration du
component (suite)
• Pour solr.DirectSolrSpellchecker :
– field : nom du champ dans lequel lire les valeurs
– thresholdTokenFrequency : entre 0 et 1; pour exclure les termes
qui n’apparaissent pas souvent (défaut : 0, tous les termes. A
priori 0.01 élimine les mots bizarres)
– maxEdits : nombre de lettres de différence autorisé (1 ou 2)
différence avec accuracy ?
– minPrefix : nombre de lettres communes au début du terme
– minQueryLength : nombre mini de lettres dans la recherche pour
déclencher un suggest
• Pour solr.IndexBasedSpellChecker :
– field & thresholdTokenFrequency : comme au-dessus
• Pour solr.FileBasedSpellChecker :
– sourceLocation : référence au fichier (1 mot par ligne)
– characterEncoding : encodage du fichier
• Voir http://wiki.apache.org/solr/SpellCheckComponent et
http://docs.lucidworks.com/display/solr/Spell+Checking
Thomas Francart,
Spellcheck : configuration du
handler
• Le spellcheck component est normalement
toujours ajouté à un requestHandler existant
(jamais appelé séparément)
<requestHandler name="/myHandler" class="solr.SearchHandler">
<lst name="defaults">
<!-- Active le specllchecking -->
<str name="spellcheck">true</str>
<!-- Nom du spellchecker (attribut "name") -->
<str name="spellcheck.dictionary">default</str>
<!-- Nombre de propositions par mot -->
<str name="spellcheck.count">1</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
Thomas Francart,
Spellcheck : paramètres de
query
• spellcheck=true : active le spellcheck
• spellcheck.dictionary : doit correspondre à « name » du
component
• spellcheck.count : nombre de suggestion à retourner
• spellcheck.onlyMorePopular : Retourne seulement des
termes de l'index + fréquents que le terme d'origine
• spellcheck.extendedResults : Retourne les informations de
fréquence des termes (pour du debug)
• spellcheck.collate=true : dans le cas de query multi-
termes, retourne en plus une suggestion de query complète
aggrégant les suggestions pour chaque terme
– spellcheck.maxCollations=1 nombre max de suggestions de
collations
– spellcheck.maxCollationsTries=0 si >0, nombre d’essais pour
voir si la suggestion de collation donne des résultats (mettre à 5)
– spellcheck.collateExtendedResults : ajoute des détails, pour
du debug
Thomas Francart,
Spellcheck : résultats
<response>…
<lst name="spellcheck">
<lst name="suggestions">
<lst name="delll">
<int name="numFound">1</int>
<int name="startOffset">18</int><int name="endOffset">23</int>
<int name="origFreq">0</int>
<arr name="suggestion“><lst>
<str name="word">dell</str>
<int name="freq">2</int>
</lst></arr>
</lst>
<lst name="ultrashar">
<int name="numFound">1</int>
<int name="startOffset">24</int><int name="endOffset">33</int>
<int name="origFreq">0</int>
<arr name="suggestion“><lst>
<str name="word">ultrasharp</str>
<int name="freq">2</int>
</lst></arr>
</lst>
<bool name="correctlySpelled">false</bool>
<str name="collation">price:[80 TO 100] dell ultrasharp</str>
</lst>
</lst>
</response>
Thomas Francart,
Le highlight
Thomas Francart,
Highlight : paramètres
• hl=true
– Active le highlight
• hl.fl=<field1>,<field2>,<fieldN>
– Liste des champs à highlighter
– Par défaut, liste des champs dans le paramètre « qf »
de edismax
• hl.usePhraseHighlighter=true
– Fait en sorte qu’une « phrase query » comme « a b c »
highlighte « b » seulement dans un morceau de texte
« a b c »
• Beaucoup d’autres options avancées existent,
voir
http://wiki.apache.org/solr/HighlightingParameters
Thomas Francart,
Highlight : résultats
• Le highlight est un component à part entière,
et ses résultats sont donc séparés de la liste de
résultat des documents en tant que telle !
Thomas Francart,
Les facettes
La « killer-feature » de SolR
Thomas Francart,
Les facettes
• « recherche à facette », « navigation par
facettes », « recherche guidée »,
« recherche paramétrique » désignent la
même chose :
• L’enrichissement d’un résultat de
recherche avec des informations
aggrégées sur la liste de résultats;
• Similaire à un « GROUP BY » en SQL, fait
automatiquement lors d’une recherche;
Thomas Francart,
Plusieurs types de facettes
• facet_fields : Facette sur valeur de champs
(les plus communes)
– Pour chaque valeur d’un champ, compte le nombre
de résultats qui ont cette valeur;
– « combien ai-je d’items par pays ? Par mot-clé ? »
• facet_ranges : Facette sur plage de valeur
numérique ou date
– Pour une liste de plages, compte le nombre de
résultats dans chaque plage;
– « combien d’items font moins de 100 euros, entre 100
et 200 euros, 200 et 300 euros, plus de 300 euros ? »
• facet_queries : Facette sur des query
dynamiques
– Pour une liste de querys, compte le nombre de
résultats pour chaque queryes;
Thomas Francart,
Les facettes : contraintes
• Un champ facetté doit être
« indexed=true »
• Un champ facetté ne doit pas être
tokenisé (en général)
Thomas Francart,
Les facettes : paramètres
• facet=true
– Active les facettes
• facet.field=<nom_du_champ>
– Donne le nom d’un champ sur lequel on
veut facetter
– On peut répéter ce paramètre plusieurs
fois pour facetter sur plusieurs champs (ce
que ne permet pas l’interface d’admin)
Thomas Francart,
Les facettes : paramètres
• Tous les paramètres suivants peuvent être mis :
– Soit tels quels pour s’appliquer à toutes les facettes;
– Soit préfixés par « f.<nom_du_champ>.<parametre> » pour
s’appliquer à une seule facette; c’est préférable.
• facet.sort=count ou facet.sort=index
– Tri la liste de valeurs par nombre de documents associés
(défaut) ou par ordre alphabétique
• Exemple : f.motcle.facet.sort=index
• facet.limit=100
– Nombre maxi de valeurs pour une facette (défaut : 100)
• Exemple : f.motcle.facet.limit=10
• facet.mincount=1
– Nombre mini de résultats associés à une valeur pour que
celle-ci s’affiche
• Par défaut, mincount=0, ce qui veut dire que même les valeurs
sans résultat s’affichent
• Exemple : f.annee.facet.mincount=1
Thomas Francart,
Les facettes : paramètres
• facet.missing=on
– Inclut une valeur vide supplémentaire pour
compter les résultats qui n’ont pas de valeur pour
ce champ
• Exemple : f.motcle.facet.missing=on
• facet.offset=10
– Offset de départ dans la liste des valeurs (à
combiner avec facet.limit pour paginer dans
les valeurs de facettes)
• Exemple : f.motcle.facet.offset=10
• facet.prefix=<chaine> (advanced)
– Ne garde que les valeurs de facettes qui
commencent par la chaine indiquée
• Utilisée pour des facettes hiérarchiques ou de
l’autocompletion
Thomas Francart,
Les facettes ranges : paramètres
• facet.range=<nom_du_champ>
– Fait une facette range sur un champ
• Tous les paramètres suivants peuvent
être mis :
– Soit tels quels pour s’appliquer à toutes les
facettes;
– Soit préfixés par
« f.<nom_du_champ>.<parametre> » pour
s’appliquer à une seule facette; c’est
préférable.
Thomas Francart,
Les facettes ranges : paramètres
• facet.range.start=<valeur>
– Valeur de début de la facette
• facet.range.end=<valeur>
– Valeur de fin de la facette
• facet.range.gap=<valeur>
– Le pas de l’itération pour chaque range (10 en 10, 5 en 5,
etc.)
• facet.range.hardend=true
– Tronque le dernier range si facet.range.gap va au-delà de
facet.range.end (défaut : false)
• facet.range.other=all|none|before|after|be
tween
– Inclut des valeurs supplémentaires pour compte le nombre
de résultats avant/après/dans la place spécifiée; « none »
(par défaut » ne compte rien de plus, « all » compte
avant/après/dans la place en même temps.
Thomas Francart,
L’autocompletion
Ou « query suggest »
Thomas Francart,
Plusieurs types
d’autocompletion
1. Recherche instantanée
Chaque proposition correspond à un résultat de recherche
2. Suggestion de recherche basée sur les logs
Chaque proposition correspond à une recherche
fréquemment effectuée (à la Google)
3. Suggestion de recherche basée sur l’index
Chaque proposition correspond à un terme présent dans
l’index
4. Suggestion de valeur de facette
Chaque proposition correspond à une valeur de facette
possible (avec le nom de la facette indiquée)
Thomas Francart,
Suggestions basées sur l’index :
solution 1 : facet.prefix
• Les facettes peuvent être utilisées pour implémenter
l’autocomplete
• Attention, prends beaucoup de mémoire !
• Recherche « michael ja »
– Les premiers mots de la requête sont pris comme une query
normale
• q=michael
– On facette sur le champ texte :
• facet=on
• facet.field=text
• facet.limit=5 (on veut 5 propositions)
• facet.mincount=1 (on ne veut que des termes pour lesquels il y a
effectivement un résultat)
• facet.sort=count (le défaut) pour avoir les termes les plus utilisés au début
de la liste
– Le dernier mot incomplet est pris comme préfixe de facette, on
ne veut que les valeurs de facette qui commence par ces lettres
• facet.prefix=ja
– On ne veut retourner que les résultats des facettes, pas les
documents résultats !
• rows=0
Thomas Francart,
Suggestions basées sur l’index :
solution 1 : facet.prefix
…/solr/core01/select/?q=michaelfacet=on&rows=0&facet.limit=5&facet.mincou
nt=1&facet.field=text&facet.sort=count&facet.prefix=ja&qt=myHandler&wt=jso
n&indent=on&
{ "responseHeader" : {
"status":0,
"QTime":5},
"response":{"numFound":2498,"start":0,"docs":[]},
"facet_counts":{
"facet_queries":{},
"facet_fields": {
"text":[
"jackson",18,
"james",16,
"jason",4,
"jay",4,
"jane",3 ]
}
}
}
Thomas Francart,
Suggestions basées sur l’index :
solution 2 : Suggester
• Suggester : basé sur le component
« Spellcheck »
– Désavantage par rapport à facet.prefix :
propose tous les termes, pas uniquement
ceux valides par rapport au début de la
recherche
• Nécessite de définir un nouveau
« component », qu’il faut ajouter dans un
handler
• Peut lire ses valeurs depuis un fichier (mais
attention aux problèmes de caractères
accentués)
• Voir http://wiki.apache.org/solr/Suggester
Thomas Francart,
Suggestions basées sur l’index :
solution 2 : Suggester
<searchComponent name="suggest" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">suggest</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.FSTLookupFactory</str>
<str name="field">name</str> <!-- nom du champ d'index -->
<float name="threshold">0.005</float>
<str name="buildOnCommit">true</str>
<!-- <str name="sourceLocation">chemin-vers-un-fichier.txt</str> -->
</lst>
</searchComponent>
<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.count">5</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
Thomas Francart,
L’ « élévation »
Tuner manuellement les résultats
Thomas Francart,
Component « QueryElevation »
• Consiste à tuner query par query les
résultats ne remontant certains
documents au début de la liste
• Ne remplace pas une bonne
configuration d’index ! Scénarios :
– Corrections d’erreurs évidentes sur des
recherches populaires
– Mots-clés payants pour un site de pages
jaunes
– Choix éditoriaux pour un site de news
Thomas Francart,
QueryElevation : component
<searchComponent name="elevator"
class="org.apache.solr.handler.component.QueryElevationComp
onent">
<!-- fieldType pour comparer 'q' au fichier de config -->
<str name="queryFieldType">text</str>
<!-- Référence au fichier de config dans conf -->
<str name="config-file">elevate.xml</str>
<!-- Force l'élévation indépendamment du param 'sort' -->
<str name="forceElevation">true</str>
</searchComponent>
<requestHandler name="/elevate“ class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
</lst>
<arr name="last-components“>
<str>elevator</str>
</arr>
</requestHandler>
Thomas Francart,
QueryElevation : fichier de
config
<elevate>
<query text="education">
<doc id="A" />
<doc id="B" />
<doc id="C" exclude="true" />
</query>
<query text="africa">
<doc id="D" />
</query>
<!-- etc... -->
</elevate>
Thomas Francart,
thomas.francart@
Web de
Structuration des
Accès aux
sparna.fr
données
informations
connaissances

Contenu connexe

Tendances

Oracle SQL, PL/SQL Performance tuning
Oracle SQL, PL/SQL Performance tuningOracle SQL, PL/SQL Performance tuning
Oracle SQL, PL/SQL Performance tuningSmitha Padmanabhan
 
Pretius Oracle Apex Primer
Pretius Oracle Apex PrimerPretius Oracle Apex Primer
Pretius Oracle Apex PrimerPretius
 
Understand oracle real application cluster
Understand oracle real application clusterUnderstand oracle real application cluster
Understand oracle real application clusterSatishbabu Gunukula
 
The oracle database architecture
The oracle database architectureThe oracle database architecture
The oracle database architectureAkash Pramanik
 
Oracle Active Data Guard: Best Practices and New Features Deep Dive
Oracle Active Data Guard: Best Practices and New Features Deep Dive Oracle Active Data Guard: Best Practices and New Features Deep Dive
Oracle Active Data Guard: Best Practices and New Features Deep Dive Glen Hawkins
 
Explain the explain_plan
Explain the explain_planExplain the explain_plan
Explain the explain_planMaria Colgan
 
Oracle application express ppt
Oracle application express pptOracle application express ppt
Oracle application express pptAbhinaw Kumar
 
Serving BERT Models in Production with TorchServe
Serving BERT Models in Production with TorchServeServing BERT Models in Production with TorchServe
Serving BERT Models in Production with TorchServeNidhin Pattaniyil
 
MDX (Multi Dimensional Expressions) Introduction
MDX (Multi Dimensional Expressions) IntroductionMDX (Multi Dimensional Expressions) Introduction
MDX (Multi Dimensional Expressions) IntroductionDigvendra Singh
 
Understanding oracle rac internals part 1 - slides
Understanding oracle rac internals   part 1 - slidesUnderstanding oracle rac internals   part 1 - slides
Understanding oracle rac internals part 1 - slidesMohamed Farouk
 
Tuning ML Models: Scaling, Workflows, and Architecture
Tuning ML Models: Scaling, Workflows, and ArchitectureTuning ML Models: Scaling, Workflows, and Architecture
Tuning ML Models: Scaling, Workflows, and ArchitectureDatabricks
 
My First 100 days with an Exadata (PPT)
My First 100 days with an Exadata (PPT)My First 100 days with an Exadata (PPT)
My First 100 days with an Exadata (PPT)Gustavo Rene Antunez
 
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...Lucidworks
 
Can You Do That with APEX? Building Not So Straightforward Pages
Can You Do That with APEX? Building Not So Straightforward PagesCan You Do That with APEX? Building Not So Straightforward Pages
Can You Do That with APEX? Building Not So Straightforward PagesDimitri Gielis
 
Or2019 DSpace 7 Enhanced submission &amp; workflow
Or2019 DSpace 7 Enhanced submission &amp; workflowOr2019 DSpace 7 Enhanced submission &amp; workflow
Or2019 DSpace 7 Enhanced submission &amp; workflow4Science
 
Java OOP Programming language (Part 5) - Inheritance
Java OOP Programming language (Part 5) - InheritanceJava OOP Programming language (Part 5) - Inheritance
Java OOP Programming language (Part 5) - InheritanceOUM SAOKOSAL
 
MLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning LibraryMLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning Libraryjeykottalam
 

Tendances (20)

Oracle SQL, PL/SQL Performance tuning
Oracle SQL, PL/SQL Performance tuningOracle SQL, PL/SQL Performance tuning
Oracle SQL, PL/SQL Performance tuning
 
Pretius Oracle Apex Primer
Pretius Oracle Apex PrimerPretius Oracle Apex Primer
Pretius Oracle Apex Primer
 
Understand oracle real application cluster
Understand oracle real application clusterUnderstand oracle real application cluster
Understand oracle real application cluster
 
The oracle database architecture
The oracle database architectureThe oracle database architecture
The oracle database architecture
 
Aula 06 - Diagrama de classes
Aula 06 - Diagrama de classesAula 06 - Diagrama de classes
Aula 06 - Diagrama de classes
 
Oracle Active Data Guard: Best Practices and New Features Deep Dive
Oracle Active Data Guard: Best Practices and New Features Deep Dive Oracle Active Data Guard: Best Practices and New Features Deep Dive
Oracle Active Data Guard: Best Practices and New Features Deep Dive
 
Dspace 7 presentation
Dspace 7 presentationDspace 7 presentation
Dspace 7 presentation
 
Explain the explain_plan
Explain the explain_planExplain the explain_plan
Explain the explain_plan
 
Oracle application express ppt
Oracle application express pptOracle application express ppt
Oracle application express ppt
 
Serving BERT Models in Production with TorchServe
Serving BERT Models in Production with TorchServeServing BERT Models in Production with TorchServe
Serving BERT Models in Production with TorchServe
 
MDX (Multi Dimensional Expressions) Introduction
MDX (Multi Dimensional Expressions) IntroductionMDX (Multi Dimensional Expressions) Introduction
MDX (Multi Dimensional Expressions) Introduction
 
Understanding oracle rac internals part 1 - slides
Understanding oracle rac internals   part 1 - slidesUnderstanding oracle rac internals   part 1 - slides
Understanding oracle rac internals part 1 - slides
 
Tuning ML Models: Scaling, Workflows, and Architecture
Tuning ML Models: Scaling, Workflows, and ArchitectureTuning ML Models: Scaling, Workflows, and Architecture
Tuning ML Models: Scaling, Workflows, and Architecture
 
My First 100 days with an Exadata (PPT)
My First 100 days with an Exadata (PPT)My First 100 days with an Exadata (PPT)
My First 100 days with an Exadata (PPT)
 
Diagrama de Classes
Diagrama de ClassesDiagrama de Classes
Diagrama de Classes
 
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
Learning to Rank in Solr: Presented by Michael Nilsson & Diego Ceccarelli, Bl...
 
Can You Do That with APEX? Building Not So Straightforward Pages
Can You Do That with APEX? Building Not So Straightforward PagesCan You Do That with APEX? Building Not So Straightforward Pages
Can You Do That with APEX? Building Not So Straightforward Pages
 
Or2019 DSpace 7 Enhanced submission &amp; workflow
Or2019 DSpace 7 Enhanced submission &amp; workflowOr2019 DSpace 7 Enhanced submission &amp; workflow
Or2019 DSpace 7 Enhanced submission &amp; workflow
 
Java OOP Programming language (Part 5) - Inheritance
Java OOP Programming language (Part 5) - InheritanceJava OOP Programming language (Part 5) - Inheritance
Java OOP Programming language (Part 5) - Inheritance
 
MLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning LibraryMLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning Library
 

En vedette

Introduction to Apache Solr
Introduction to Apache SolrIntroduction to Apache Solr
Introduction to Apache SolrAndy Jackson
 
Apprendre Solr en deux heures
Apprendre Solr en deux heuresApprendre Solr en deux heures
Apprendre Solr en deux heuresSaïd Radhouani
 
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014francelabs
 
Moteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUGMoteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUGLucian Precup
 
Marseille JUG Novembre 2013 Lucene Solr France Labs
Marseille JUG Novembre 2013 Lucene Solr France LabsMarseille JUG Novembre 2013 Lucene Solr France Labs
Marseille JUG Novembre 2013 Lucene Solr France Labsfrancelabs
 
Presentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGPresentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGfrancelabs
 
DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...
DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...
DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...Drupaltour
 
Sharded Solr setup with master
Sharded Solr setup with masterSharded Solr setup with master
Sharded Solr setup with masterSourcesense
 
PROV-O Tutorial. DC-2013 Conference
PROV-O Tutorial. DC-2013 ConferencePROV-O Tutorial. DC-2013 Conference
PROV-O Tutorial. DC-2013 Conferencedgarijo
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08Loïc Descotte
 
T3UNI12 : SOLR workshop
T3UNI12 : SOLR workshopT3UNI12 : SOLR workshop
T3UNI12 : SOLR workshopPaul Blondiaux
 
A la recherche d'ElasticSearch
A la recherche d'ElasticSearchA la recherche d'ElasticSearch
A la recherche d'ElasticSearchNinnir
 
Introduction à ElasticSearch
Introduction à ElasticSearchIntroduction à ElasticSearch
Introduction à ElasticSearchFadel Chafai
 
Chapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibanaChapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibanaFabien SABATIER
 
Chapitre3 elk concepts_avances
Chapitre3 elk concepts_avancesChapitre3 elk concepts_avances
Chapitre3 elk concepts_avancesFabien SABATIER
 
Apache Solr crash course
Apache Solr crash courseApache Solr crash course
Apache Solr crash courseTommaso Teofili
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementMohamed hedi Abidi
 
Introduction to Apache Solr.
Introduction to Apache Solr.Introduction to Apache Solr.
Introduction to Apache Solr.ashish0x90
 

En vedette (20)

Introduction to Apache Solr
Introduction to Apache SolrIntroduction to Apache Solr
Introduction to Apache Solr
 
Apprendre Solr en deux heures
Apprendre Solr en deux heuresApprendre Solr en deux heures
Apprendre Solr en deux heures
 
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
 
Moteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUGMoteurs de recherche et Lucene at LorraineJUG
Moteurs de recherche et Lucene at LorraineJUG
 
Marseille JUG Novembre 2013 Lucene Solr France Labs
Marseille JUG Novembre 2013 Lucene Solr France LabsMarseille JUG Novembre 2013 Lucene Solr France Labs
Marseille JUG Novembre 2013 Lucene Solr France Labs
 
Presentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGPresentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUG
 
JSON-LD
JSON-LDJSON-LD
JSON-LD
 
DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...
DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...
DrupalTour. Lviv — Apache solr. Advanced use cases (Artem Sylchuk, InternetDe...
 
Sharded Solr setup with master
Sharded Solr setup with masterSharded Solr setup with master
Sharded Solr setup with master
 
PROV-O Tutorial. DC-2013 Conference
PROV-O Tutorial. DC-2013 ConferencePROV-O Tutorial. DC-2013 Conference
PROV-O Tutorial. DC-2013 Conference
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08
 
T3UNI12 : SOLR workshop
T3UNI12 : SOLR workshopT3UNI12 : SOLR workshop
T3UNI12 : SOLR workshop
 
Chapitre1 elk chez_psa
Chapitre1 elk chez_psaChapitre1 elk chez_psa
Chapitre1 elk chez_psa
 
A la recherche d'ElasticSearch
A la recherche d'ElasticSearchA la recherche d'ElasticSearch
A la recherche d'ElasticSearch
 
Introduction à ElasticSearch
Introduction à ElasticSearchIntroduction à ElasticSearch
Introduction à ElasticSearch
 
Chapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibanaChapitre2 prise en_main_kibana
Chapitre2 prise en_main_kibana
 
Chapitre3 elk concepts_avances
Chapitre3 elk concepts_avancesChapitre3 elk concepts_avances
Chapitre3 elk concepts_avances
 
Apache Solr crash course
Apache Solr crash courseApache Solr crash course
Apache Solr crash course
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et Développement
 
Introduction to Apache Solr.
Introduction to Apache Solr.Introduction to Apache Solr.
Introduction to Apache Solr.
 

Similaire à Solr formation Sparna

Modèles de données et langages de description ouverts 5 - 2021-2022
Modèles de données et langages de description ouverts   5 - 2021-2022Modèles de données et langages de description ouverts   5 - 2021-2022
Modèles de données et langages de description ouverts 5 - 2021-2022François-Xavier Boffy
 
Découvrir les données de data.bnf.fr en utilisant SPARQL
Découvrir les données de data.bnf.fr en utilisant SPARQLDécouvrir les données de data.bnf.fr en utilisant SPARQL
Découvrir les données de data.bnf.fr en utilisant SPARQLThomas Francart
 
Les API de HAL - Formation CCSD mars 2016
Les API de HAL - Formation CCSD mars 2016Les API de HAL - Formation CCSD mars 2016
Les API de HAL - Formation CCSD mars 2016OAccsd
 
ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)
ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)
ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)Phonothèque MMSH
 
Méthodologie de la recherche documentaire informatisée
Méthodologie de la recherche documentaire informatiséeMéthodologie de la recherche documentaire informatisée
Méthodologie de la recherche documentaire informatiséeSCD Paris-Sorbonne
 
Geneva jug Lucene Solr
Geneva jug Lucene Solr Geneva jug Lucene Solr
Geneva jug Lucene Solr francelabs
 
Exploration et visualisation de fichiers XML avec BaseX
Exploration et visualisation de fichiers XML avec BaseXExploration et visualisation de fichiers XML avec BaseX
Exploration et visualisation de fichiers XML avec BaseXEmmanuelle Morlock
 
Sudoc, Calames, theses.fr et le Web de données
Sudoc, Calames, theses.fr et le Web de donnéesSudoc, Calames, theses.fr et le Web de données
Sudoc, Calames, theses.fr et le Web de donnéesY. Nicolas
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABESABES
 
Modèles de données et langages de description ouverts 2021-2022 - 3
Modèles de données et langages de description ouverts   2021-2022 - 3Modèles de données et langages de description ouverts   2021-2022 - 3
Modèles de données et langages de description ouverts 2021-2022 - 3François-Xavier Boffy
 
Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Laurent BUNIET
 
Classificateur d'URL
Classificateur d'URLClassificateur d'URL
Classificateur d'URLmartin255
 
Classificateur d'URL
Classificateur d'URLClassificateur d'URL
Classificateur d'URLmartin255
 
INF240 - Bases de données DUT SRC1 - Cours 3
INF240 - Bases de données DUT SRC1 - Cours 3INF240 - Bases de données DUT SRC1 - Cours 3
INF240 - Bases de données DUT SRC1 - Cours 3PGambette
 
Entrees sorties
Entrees sortiesEntrees sorties
Entrees sortiesyazidds2
 

Similaire à Solr formation Sparna (20)

Modèles de données et langages de description ouverts 5 - 2021-2022
Modèles de données et langages de description ouverts   5 - 2021-2022Modèles de données et langages de description ouverts   5 - 2021-2022
Modèles de données et langages de description ouverts 5 - 2021-2022
 
Découvrir les données de data.bnf.fr en utilisant SPARQL
Découvrir les données de data.bnf.fr en utilisant SPARQLDécouvrir les données de data.bnf.fr en utilisant SPARQL
Découvrir les données de data.bnf.fr en utilisant SPARQL
 
Les API de HAL - Formation CCSD mars 2016
Les API de HAL - Formation CCSD mars 2016Les API de HAL - Formation CCSD mars 2016
Les API de HAL - Formation CCSD mars 2016
 
ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)
ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)
ATED 2015 - Données numériques et Mémoire par Nicolas Larrousse (Huma-Num)
 
Méthodologie de la recherche documentaire informatisée
Méthodologie de la recherche documentaire informatiséeMéthodologie de la recherche documentaire informatisée
Méthodologie de la recherche documentaire informatisée
 
Geneva jug Lucene Solr
Geneva jug Lucene Solr Geneva jug Lucene Solr
Geneva jug Lucene Solr
 
RDF : une introduction
RDF : une introductionRDF : une introduction
RDF : une introduction
 
Exploration et visualisation de fichiers XML avec BaseX
Exploration et visualisation de fichiers XML avec BaseXExploration et visualisation de fichiers XML avec BaseX
Exploration et visualisation de fichiers XML avec BaseX
 
Sudoc, Calames, theses.fr et le Web de données
Sudoc, Calames, theses.fr et le Web de donnéesSudoc, Calames, theses.fr et le Web de données
Sudoc, Calames, theses.fr et le Web de données
 
RDFS : une introduction
RDFS : une introductionRDFS : une introduction
RDFS : une introduction
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABES
 
Modèles de données et langages de description ouverts 2021-2022 - 3
Modèles de données et langages de description ouverts   2021-2022 - 3Modèles de données et langages de description ouverts   2021-2022 - 3
Modèles de données et langages de description ouverts 2021-2022 - 3
 
Le langage sql
Le langage sqlLe langage sql
Le langage sql
 
Le langage sql
Le langage sqlLe langage sql
Le langage sql
 
Drools
DroolsDrools
Drools
 
Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4
 
Classificateur d'URL
Classificateur d'URLClassificateur d'URL
Classificateur d'URL
 
Classificateur d'URL
Classificateur d'URLClassificateur d'URL
Classificateur d'URL
 
INF240 - Bases de données DUT SRC1 - Cours 3
INF240 - Bases de données DUT SRC1 - Cours 3INF240 - Bases de données DUT SRC1 - Cours 3
INF240 - Bases de données DUT SRC1 - Cours 3
 
Entrees sorties
Entrees sortiesEntrees sorties
Entrees sorties
 

Plus de Thomas Francart

SPARQL introduction and training (130+ slides with exercices)
SPARQL introduction and training (130+ slides with exercices)SPARQL introduction and training (130+ slides with exercices)
SPARQL introduction and training (130+ slides with exercices)Thomas Francart
 
SPARQL queries on CIDOC-CRM data of BritishMuseum
SPARQL queries on CIDOC-CRM data of BritishMuseumSPARQL queries on CIDOC-CRM data of BritishMuseum
SPARQL queries on CIDOC-CRM data of BritishMuseumThomas Francart
 
SPARQL sur les données CIDOC-CRM du British Museum
SPARQL sur les données CIDOC-CRM du British MuseumSPARQL sur les données CIDOC-CRM du British Museum
SPARQL sur les données CIDOC-CRM du British MuseumThomas Francart
 
CIDOC-CRM + SPARQL Tutorial sur les données Doremus
CIDOC-CRM + SPARQL Tutorial sur les données DoremusCIDOC-CRM + SPARQL Tutorial sur les données Doremus
CIDOC-CRM + SPARQL Tutorial sur les données DoremusThomas Francart
 
SKOS Play @ semweb.pro 2014
SKOS Play @ semweb.pro 2014SKOS Play @ semweb.pro 2014
SKOS Play @ semweb.pro 2014Thomas Francart
 
Web of Data - Introduction (english)
Web of Data - Introduction (english)Web of Data - Introduction (english)
Web of Data - Introduction (english)Thomas Francart
 
Partager et réutiliser des données sur le web
Partager et réutiliser des données sur le webPartager et réutiliser des données sur le web
Partager et réutiliser des données sur le webThomas Francart
 
Web de données - une introduction
Web de données - une introductionWeb de données - une introduction
Web de données - une introductionThomas Francart
 

Plus de Thomas Francart (9)

SPARQL introduction and training (130+ slides with exercices)
SPARQL introduction and training (130+ slides with exercices)SPARQL introduction and training (130+ slides with exercices)
SPARQL introduction and training (130+ slides with exercices)
 
SPARQL queries on CIDOC-CRM data of BritishMuseum
SPARQL queries on CIDOC-CRM data of BritishMuseumSPARQL queries on CIDOC-CRM data of BritishMuseum
SPARQL queries on CIDOC-CRM data of BritishMuseum
 
SPARQL sur les données CIDOC-CRM du British Museum
SPARQL sur les données CIDOC-CRM du British MuseumSPARQL sur les données CIDOC-CRM du British Museum
SPARQL sur les données CIDOC-CRM du British Museum
 
CIDOC-CRM + SPARQL Tutorial sur les données Doremus
CIDOC-CRM + SPARQL Tutorial sur les données DoremusCIDOC-CRM + SPARQL Tutorial sur les données Doremus
CIDOC-CRM + SPARQL Tutorial sur les données Doremus
 
SKOS Play @ semweb.pro 2014
SKOS Play @ semweb.pro 2014SKOS Play @ semweb.pro 2014
SKOS Play @ semweb.pro 2014
 
Web of Data - Introduction (english)
Web of Data - Introduction (english)Web of Data - Introduction (english)
Web of Data - Introduction (english)
 
Partager et réutiliser des données sur le web
Partager et réutiliser des données sur le webPartager et réutiliser des données sur le web
Partager et réutiliser des données sur le web
 
Skos play
Skos playSkos play
Skos play
 
Web de données - une introduction
Web de données - une introductionWeb de données - une introduction
Web de données - une introduction
 

Solr formation Sparna

  • 1. Thomas Francart, SolR Moteur de recherche open-source pour l’entreprise Thomas Francart, Ces supports sont la propriété intellectuelle de Thomas FRANCART et ne sauraient être réutilisés sans la permission écrite de leur auteur (thomas.francart@sparna.fr)
  • 3. Thomas Francart, Information Retrieval (IR) « trouver de l’information (en général des documents) non-structurée (en général du texte) qui répond à une intention de recherche, dans une large collection (en général numérisée) »
  • 5. Thomas Francart, SELECT * FROM post WHERE topic LIKE ‘%keyword%’ OR author LIKE ‘%keyword%’ ORDER BY id DESC
  • 6. Thomas Francart, Les SGBD ne sont pas adaptés pour faire de la recherche plein- texte • Comment fait-on pour les recherches avec plusieurs termes ? sur plusieurs tables ? • Full table scan = mauvaise performances • Pas de scoring des résultats • Gestion des langues, des recherches approchantes (pluriels, féminins, etc.)
  • 7. Thomas Francart, Chaque problème à sa solution (chaque solution a aussi ses problèmes)
  • 8. Thomas Francart, Données Processus d’indexation Moteur de recherche Recherche dans l’index Mise à jour de l’index Index Application requête réponse Données Données
  • 9. Thomas Francart, • Open-source, écrit en Java; • Serveur de recherche autonome à déployer dans un container J2EE; • Basé sur Lucene, une librairie java de recherche plein-texte;
  • 10. Thomas Francart, • La « couche basse » de SolR : une librairie Java pour écrire et rechercher dans les fichiers d’index; • Un index contient des documents • Un document contient des champs (« fields ») • Un field contient des termes (« terms ») • SolR expose les fonctionnalités de Lucene dans un serveur, au travers de HTTP;
  • 11. Thomas Francart, SolR : historique • Développé au sein de CNET par Yonik Seeley • Transféré à la fondation Apache en 2006; • Incubé jusqu’en 2007 : v1.2; • Aujourd’hui, Lucene et SolR sont dans le même projet Apache, et releasés ensemble; – On est donc passé directement de SolR 1.4 à 3.0 pour que les n° de version correspondent • Juin 2013 : v4.3.1 • Grosse communauté d’utilisateurs • Lucid Imagination : support commercial
  • 12. Thomas Francart, Et l’utilisateur alors ? • SolR s’arrête à fournir un flux de réponse en XML • SolR ne propose _pas_ d’interface utilisateur de recherche • Pour cela, on peut utiliser des librairies d’intégration en fonction du langage • Voir http://wiki.apache.org/solr/IntegratingSolr – Java : SolRJ http://wiki.apache.org/solr/Solrj – Javascript : ajax-SolR http://wiki.github.com/evolvingweb/ajax-solr – Ruby : http://projectblacklight.org/ – PHP, .Net, etc…
  • 13. Thomas Francart, Qu’est-ce qu’un index ? • Chaque document a un id et est associé à une liste de termes • Pour chaque terme, on garde la liste des id de documents qui contiennent ce terme
  • 14. Thomas Francart, Recherche plein-texte « SolR browse », interface de recherche d’exemple fournie par SolR
  • 15. Thomas Francart, Surbrillance des résultats Human Right Watch : http://www.hrw.org/search
  • 16. Thomas Francart, Recherche à facettes World Bank : http://openknowledge.worldbank.org
  • 17. Thomas Francart, Suggestions et corrections UNESCO IIEP (International Institute for Educational Planning) : http://plan4learning.iiep.unesco.org
  • 18. Thomas Francart, Recherche sur synonymes Jobtransport : http://jobtransport.com
  • 21. Thomas Francart, 1, 2, 3 ! • Télécharger, dézipper • Lancer : cd <solr>/example java –jar start.jar • Indexer les documents de test cd <solr>/example/exampledocs java -jar post.jar *.xml • Rechercher http://localhost:8983/solr (interface d’admin)
  • 22. Thomas Francart, SolR admin et les statistiques
  • 25. Thomas Francart, Entr’ouvrons le capot… • Répertoire de travail de SolR (« solr.home ») : <solr>/example/solr • Configuration des cœurs : <solr.home>/solr.xml • Données : <solr.home>/<core>/data • Configuration : <solr.home>/<core>/conf
  • 26. Thomas Francart, Entr’ouvrons le capot… • Configuration de la structure de l’index (le fichier le plus important !) <solr.home>/<core>/conf/schema.xml • + tous les autres fichiers de ce répertoire • Listes des mots vides par langue <solr.home>/<core>/conf/lang • Configuration des gestionnaires de réponse (= configuration du serveur) <solr.home>/<core>/conf/solrconfig.xml • Feuilles de style de formats de réponses <solr.home>/<core>/conf/xslt • Templates pour l’interface « browse » : <solr.home>/<core>/conf/velocity
  • 27. Thomas Francart, schema.xml • « field », « dynamicField », « uniqueKey » définissent la structure d’un document dans l’index • « copyField » duplique automatiquement les valeurs d’un champ dans un autre • « fieldType » déclare un type de champs possible pour un « field » – Contient un ou parfois deux « analyzer » • « analyzer » définit les traitements qui seront appliqués aux valeurs du field, à l’indexation et à la recherche
  • 28. Thomas Francart, Le copyField • Un index est fait pour rechercher – Vs. pour stocker • Il doit être construit : – En fonction des données – En fonction des recherches qui seront faites dessus • Il est normal de dupliquer certaines valeurs dans certains champs de configuration différentes pour répondre à différents besoins de recherche – Ex : copier une chaine vers un field « phonetique » sur lequel portera la recherche phonétique
  • 29. Thomas Francart, Un field name : son nom; type : son type, une référence à fieldType; multivalued : si un document peut avoir plusieurs valeurs pour ce champ; required : si la valeur est obligatoire (SolR renverra une erreur si on insère un document sans valeur pour ce field) indexed : si on veut pouvoir chercher ou trier sur les valeurs de ce champs; stored : si on veut ramener les valeurs de ce champs dans un résultat de recherche;
  • 30. Thomas Francart, Indexed et Stored On peut avoir des champs qui ne servent qu’à rechercher sans jamais être ramenés dans un résultat de recherche. Inversement, on peut avoir des champs qui ne servent qu’à être ramenés dans un résultat de recherche et sur lesquels on ne cherchera jamais.
  • 31. Thomas Francart, Un fieldType name : son nom (référencé dans un field); class: sa classe Java (1 classe = 1 type de données) (dans ce fichier, « solr… » est un raccourci pour « org.apache.solr.analysis ») • Quelques types de données : – solr.BoolField : booléen – solr.TrieIntField/solr.TrieLongField : entiers – solr.TrieFloatField : décimaux – solr.TrieDateField : date – solr.LatLonType : latitude/longitude – solr.CurrencyField : monnaie – solr.TextField : texte
  • 32. Thomas Francart, Tokenizer et filters : l’analyse du texte par Lucene
  • 33. Thomas Francart, Un exemple de flux d’analyse position 1 2 3 4 5 6 term text école primaire bcdiV2.0 v 2 0 bcdi bcdiv 20 bcdiV20 position 1 2 3 4 5 6 term text école primaire bcdiV2.0 V 2 0 bcdi bcdiV 20 bcdiV20 position 1 2 3 term text école primaire bcdiV2.0 RemoveDuplicatesTokenFilterFactory SnowballPorterFilterFactory ISOLatin1AccentFilterFactory StopFilterFactory LowerCaseFilterFactory WordDelimiterFilterFactory WhitespaceTokenizerFactory position 1 2 3 4 5 6 term text ecole primaire bcdiV2.0 v 2 0 bcdi bcdiv 20 bcdiV20 position 1 2 3 4 5 6 term text ecol primair bcdiV2.0 v 2 0 bcdi bcdiv 20 bcdiV20 Texte de départ : « école primaire bcdiV2.0 »
  • 35. Thomas Francart, Pratique : comprendre l’analyse • Testez l’analyse sur la chaine « Une formation débutant sur SolR » – Avec le type de champ text_ws – Avec le type de champ text_general – Avec le type de champ text_fr – Que constatez-vous ? – Lisez les commentaires associés à ces types de champs dans schema.xml • Mettez une query dans le champ query, par exemple « se former sur SolR » – Que constatez-vous ? • Avec le type de champ « string » • Essayez avec : – « Administration Apache, l’essentiel »
  • 36. Thomas Francart, Un analyzer Mission : analyser les valeurs texte d’un fieldType de classe solr.Text, soit au moment de l’insertion d’une valeur, soit au moment de la recherche d’une valeur. Un fieldType de classe solr.Text a : – Un analyzer pour le texte indexé (type=« index ») – Un analyzer pour le texte de la query (type=« query ») – (ils sont souvent très similaires) – Si un seul analyzer est paramétré sans type=« … », il est utilisé pour l’indexation _et_ la recherche Un analyzer se compose, dans l’ordre, de : – un charFilter (jamais utilisé) – un tokenizer (obligatoire) – une liste de filter
  • 37. Thomas Francart, Un analyzer <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt“ /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true“ /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
  • 38. Thomas Francart, Un tokenizer Mission : découper la chaine de caractères en tokens http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#Tokenizer Factories Plusieurs possibilités : – WhitespaceTokenizerFactory – StandardTokenizerFactory – PatternTokenizerFactory – PathHierarchyTokenizerFactory – KeywordTokenizerFactory – (et d’autres)
  • 39. Thomas Francart, Tokenizer : Quelques possibilités • WhitespaceTokenizer – Découpe sur les espaces, tabulations, sauts de ligne <tokenizer class="solr.WhitespaceTokenizerFactory"/> • StandardTokenizer – Espaces et ponctuation. Marche pour toutes langues européennes. A utiliser par défaut. <tokenizer class="solr.StandardTokenizerFactory"/> • KeywordTokenizer – Aucune tokenization ! Utile pour les valeurs à stocker telles quelles <tokenizer class="solr.KeywordTokenizerFactory"/> • PatternTokenizerFactory – Découpe en fonction d’une expression régulière
  • 40. Thomas Francart, Un filter • Mission : prendre un token en entrée, cracher 0, 1 ou n tokens en sortie (souvent différents du token d’entrée) http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#TokenFilt erFactories
  • 41. Thomas Francart, Filter : Stopwords • Format du fichier : un terme par ligne a à et un • A mettre dans à l’index ET à la query • solr.KeepWordFilterFactory : inverse de stopWords • Utiliser schema browser dans l’admin pour avoir le top 10 des termes les plus fréquents • Expérimenter avec le champ « text_fr » – Ajouter des stopwords <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
  • 42. Thomas Francart, Filter : Stemming • Stemming : ramener les formes fléchies à un radical (différent du lemme) – Pluriels, féminins, conjugaisons – « cheval », « chevaux » => « chev » – « portera », « porterait » => « porte » • Plusieurs algorithmes possibles • A mettre dans à l’index ET à la query • Expérimenter avec le champ « text_fr » – Changer le filtre de stemming en décommentant
  • 43. Thomas Francart, Filter : Synonyms • Format du fichier des synonymes : – Possibilité 1 : GB,gib => gigabyte « n’importe quelle valeur à gauche de la flèche sera remplacée par toutes les valeurs à droite de la flèche » – Possibilité 2 : GB,gib,gigabyte,gigabytes • Si expand="true", tous les termes sont équivalents, et la ligne est équivalente à : GB,gib,gigabyte,gigabytes => GB,gib,gigabyte,gigabytes • Si expand="false", toute la ligne se ramène au premier synonyme, et la ligne est équivalente à : GB,gib,gigabyte,gigabytes => GB • Expérimenter avec le champ « text_fr » – Ajouter des synonymes <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
  • 44. Thomas Francart, Synonymes : index-time ou query-time ? • Les synonymes peuvent être utilisés au moment de l’indexation ou au moment de la query • Il est conseillé de les utiliser au moment de l’indexation – question de performance – problèmes liés aux synonymes comportant plusieurs mots à la query • Un travail est en cours dans SolR pour améliorer la gestion des synonymes à la query
  • 45. Thomas Francart, Recherche phonétique • A mettre à l’index ET à la query • Plusieurs algorithmes possibles – Caverphone, Metaphone, DoubleMetaphone, etc. – DoubleMetaphone donnerait de meilleurs résultats même en dehors de l’anglais • Attention, peut donner des résultats hasardeux • A utiliser dans un champ dédié <filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>
  • 46. Thomas Francart, Autres filters • LowerCaseFilterFactory – Met tout en minuscule. A utiliser quasi- systématiquement, à l’index ET à la query • ASCIIFoldingFilterFactory – Supprime l’accentuation. A utiliser à l’index ET à la query • LengthFilterFactory – Pour ne garder que les tokens d’une certain taille • PatternReplaceFilterFactory – Pour faire du rechercher-remplace dans les tokens • http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
  • 49. Thomas Francart, Formats d’input pour SolR • XML – Cas le plus fréquent, API SolR • JSON – Même structure que le XML, mais sérialisées en JSON • Javabin – Données binaires utilisées par SolrJ • CSV • Documents riches (Word, PDF, etc.) – Avec extraction possible des métadonnées • Un SGBD – Avec le DataImportHandler
  • 50. Thomas Francart, Le format XML : add • Toutes les bibliothèques clients SolR que vous trouverez s’appuient sur ce format pour l’indexation des données • A soumettre dans un appel HTTP POST à une URL de SolR • Inutile d’envoyer les valeurs pour des fields remplis automatiquement avec un copyField <add overwrite="true"> <doc> <field name="id">5432a</field> <field name="type">Album</field> <field name="name">Murder Ballads</field> <field name="artist">Nick Cave</field> <field name="release_date">2012-07-31T09:40:00Z</field> </doc> <doc boost="2.0"> <field name="id">myid</field> <field name="type">Album</field> <field name="name">Ilo veyou</field> <!-- etc. --> </doc> </add>
  • 51. Thomas Francart, Le format XML • Overwrite – Basé sur le champ uniqueKey – Mettre à false si on est sûr de n’envoyer que des nouveaux record • Boost – Le document sortira plus haut dans les résultats que les autres
  • 52. Thomas Francart, Le format XML : delete • Pour supprimer tout l’index, il faut mieux supprimer le répertoire data et relancer SolR <delete> <id>5432a</id> <id>monId</id> </delete> <delete> <query>Artist:"Nick Cave"</query> </delete> <delete> <query>*:*</query> </delete>
  • 53. Thomas Francart, Le format XML : commit • Commits : – Lents : donc faire un seul gros commit à la fin – Pas de transactions par clients (commit global) • Optimize : committe et optimise l’index • Aucune de ces opérations ne bloque la recherche • Un commit ou un optimize peuvent aussi se faire en envoyant le paramètre ?commit=true dans l’URL http://localhost:8983/solr/collection1/update?commit=true <commit /> <rollback /> <optimize />
  • 54. Thomas Francart, Le format CSV • …/solr/core/update/csv à la place de …/solr/core/update • Les noms des colonnes du CSV doivent correspondre au noms des fields • Ce format est le seul qui soit le même en input et en output de query • On pourrait donc faire une query dans un SolR en demandant un résultat CSV et réinjecter ce résultat dans un autre SolR • Options possibles dans l’URL : • separator : séparateur à utiliser (‘,’ par défaut) • header=true : indique que la première ligne est une ligne d’entête • fieldnames=field1,field2 : indique le nom des fields à utiliser si le CSV ne contient pas d’entête • overwite=false : si on n’est sur qu’on n’overwrite rien
  • 55. Thomas Francart, Le format CSV • Options possibles dans l’URL (suite) : • skipLines=1000 : si on veut sauter des lignes • skip=field1,field2 : si certaines colonnes ne doivent pas être importées • escape= caractère d’échappement pour échapper le séparateur dans les valeurs • encapsulator=" : indique le caractère qui entoure les valeurs de champs qui contiennent le séparateur • Voir http://wiki.apache.org/solr/UpdateCSV pour les autres options
  • 57. Thomas Francart, XML d’un résultat de recherche Entête Résultats • numFound : nombre total de résultats • start : offset de début
  • 58. Thomas Francart, Format XML générique • Même format dans le XML de résultat et dans solrconfig.xml – <arr> : un tableau – <lst> : une liste dont tous les éléments on un attribut « name » – <str>, <int>, <long>, <float>, <double>, <bool> – <date> : format ISO-8601 • 1965-1-30T05:00:00Z
  • 59. Thomas Francart, Décoder l’URL • Faire la requete suivante dans SolR admin : – Titre_en:education – Start=0 et rows=20 • Comprendre l’URL – /solr/formation : nom du core – /select : le RequestHandler interrogé – Paramètres (encodés avec %) : • q : notre query • start et rows : pagination • wt : serialisation XML • indent : indique qu’on veut indenter le résultat
  • 60. Thomas Francart, Un exemple réel de requête http://localhost:8389/core01/select/?q=primaire&start=0&rows=50&fl=*+score& qt=dismax&qf=label_fr^1+description_fr^0.4+label2_fr^0.4+description^0.6+no tesAbb^0.4+notes^0.4+introduction_fr^0.3+publicCode^0.3+openCategory1^0. 4+openCategory2^0.4+openCategory3^0.4+openCategory4^0.4+filename2^0. 1+urlDir2^0.1&facet=true&facet.mincount=1&facet.limit=5&facet.field=label_fr &facet.field=introduction_fr&facet.field=label_fr_rayon&facet.field=openCatego ry1&hl=on&hl.fl=description,label_fr,notesAbb,label2_fr&hl.highlightMultiTerm= true&spellcheck=true&spellcheck.extendedResults=true&spellcheck.collate=tr ue&spellcheck.onlyMorePopular=true&spellcheck.count=5&sort=score+desc& hl.fragsize=200&debugQuery=on
  • 61. Thomas Francart, Un RequestHandler • Ouvrir le fichier conf/solrconfig.xml • Chercher le requestHandler « /select » <requestHandler name="/select" class="solr.SearchHandler"> <!-- default values for query parameters can be specified, these will be overridden by parameters in the request --> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <str name="df">text</str> </lst> <!-- ... --> </requestHandler>
  • 62. Thomas Francart, Un RequestHandler • Configure un type de recherche (ou d’update) – Indique des paramètres par défaut – Indique quels composants de recherche utiliser (« components ») • Recommendation : configurer un RequestHandler par type de recherche dans votre application • Chercher le RequestHandler « /browse » pour voir sa longue liste de paramètres
  • 63. Thomas Francart, Appeler un RequestHandler • Il y a 2 façons d’appeler un RequestHandler : 1. Soit à l’URL /select avec le paramètre « qt » (pour « queryType ») contenant le nom du requestHandler 2. Soit en appelant l’URL correspondant au nom du RequestHandler http://localhost:8389/core01/select/?q=primaire&qt=myRequestHandler http://localhost:8389/core01/myRequestHandler?q=primaire
  • 64. Thomas Francart, RequestHandler : liste « defaults » • La liste « defaults » donne les valeurs des paramètres qui seront utilisées si aucune valeur n’est précisée explicitement dans la query <requestHandler name="/myHandler" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <!-- etc... --> </lst> <!-- ... --> </requestHandler>
  • 65. Thomas Francart, RequestHandler : liste « appends » • La liste « appends » donne les valeurs des paramètres qui seront ajoutées aux paramètres multivalués de la query (comme fq) <requestHandler name="/myHandler" class="solr.SearchHandler"> <lst name="appends"> <str name="fq">a_type:group</str> <!-- etc... --> </lst> <!-- ... --> </requestHandler>
  • 66. Thomas Francart, RequestHandler : liste « invariants » • La liste « invariants » donne les valeurs des paramètres qui seront toujours utilisés, quelque soit les valeurs indiqués dans la query (utile pour sécuriser les requestHandler) <requestHandler name="/myHandler" class="solr.SearchHandler"> <lst name="invariants"> <str name="facets">false</str> <!-- etc... --> </lst> <!-- ... --> </requestHandler>
  • 67. Thomas Francart, Les « components » de recherche • Un « component » exécute une fonctionnalité de recherche : highlight, facettes, MLT, etc. • Chaque « component » est déclaré dans une section de solrconfig.xml <searchComponent class="solr.HighlightComponent" name="highlight“> <highlighting> <!-- etc... --> </highlighting> </searchComponent>
  • 68. Thomas Francart, RequestHandler : array « components » • Un RequestHandler se compose d’une liste de « components » • Il y a une liste de components par défaut, défini dans l’array « components » • Si on redéfini un array nommé « components », on overwrite les composants par défaut <requestHandler name="/myHandler" class="solr.SearchHandler"> <arr name="components"> <str>query</str> <str>facet</str> <str>mlt</str> <str>highlight</str> <str>stats</str> <str>debug</str> </arr> </requestHandler>
  • 69. Thomas Francart, RequestHandler : array « first- components » et « last-components » • On peut ajouter un composant de recherche au début ou à la fin de la liste par défaut avec « first- components » et « last-components » <requestHandler name="/myHandler" class="solr.SearchHandler"> <arr name="last-components"> <str>elevator</str> </arr> </requestHandler>
  • 70. Thomas Francart, Paramètres de recherche communs • La query : q (query) query de recherche fq (filterQuery) queries de filtrage (~ WHERE SQL) defType le parser de query (lucene ou edismax) • Pagination rows Nombre de résultats start Offset de départ de la liste • Output : fl (fieldList) Champs à remonter sort Critère de tri wt (writer type) Format de la réponse • Diagnostic : indent Indentation du résultat echoParams Ce que SolR a compris de la recherche debugQuery votre ami pour le tuning
  • 71. Thomas Francart, Le paramètre df • « df » (= « default field ») indique le field cherché par défaut (ici : « text ») • Mais notre schéma ne contient pas de champ « text » ! • Ajoutons-le • Remplissons-le avec des « copyField » : – titre_en, titre_fr, resume, motcle, pays, auteur • Reindexons les données • Tester la requête « education » (vs. « titre_en:education »
  • 72. Thomas Francart, Paramètres de recherche communs • Expérimenter dans l’interface d’admin – Q=education et fq=« pays:France » vs. q=«education AND pays:France » – Activer « debugQuery » pour voir ce que SolR a compris de la requête – fl:titre_en,titre_fr pour ne ramener que les titres – Jouer avec start et rows pour paginer – Essayer wt=json pour avoir du JSON plutôt que du XML
  • 73. Thomas Francart, Le score et le tri • Field spécial « score » – on peut le ramener avec le paramètre « fl=score » • « sort » se fait sur ce pseudo-champ « score » par défaut • Tester avec sort=titre_en pour trier par ordre alphabétique des titres
  • 74. Thomas Francart, Syntaxe de recherche • La syntaxe dépend du parser de query (paramètre defType) – Lucene – Ou dismax ou edismax • Le parser « lucene » est le plus précis et permet de combiner des critères sur tous les champs – mais une « search box » dans une interface est toujours branchée sur un defType=edismax qui est plus simple pour du plein-texte
  • 75. Thomas Francart, Syntaxe de recherche Lucene : clauses • *:* matche tous les documents • Une recherche est un ensemble de clauses : – education : clause optionnelle – +education : clause obligatoire – -education : clause interdite • Indiquer un field spécifique pour une clause : – pays:France • Combiner les clauses : – AND / && : +education AND pays:france – OR / || : +education OR pays:france • Parenthesage – (education AND teacher) OR (quality AND plan) • (+education +teacher) (+quality +plan) • différent de +(education teacher) +(quality plan)
  • 76. Thomas Francart, Syntaxe de recherche Lucene : phrase et wildcard • « Phrase query » : – quality education vs. « quality education » • Proximité des mots – « quality education »~3 • Wildcard queries – educat* – In*tion –innovation – Innova???? – *tion – Attention : lent (il faut configurer un field spécial pour cela)
  • 77. Thomas Francart, Syntaxe de recherche Lucene : fuzzy, range, boost • Fuzzy queries – auteur:ewing vs. auteur:ewing~ vs. auteur:ewing~0.8 • Range queries – education AND annee:[1999 TO 2001] – education AND annee:[2001 TO *] • Score boosting – Child primary^10
  • 78. Thomas Francart, Mr « Eddy Smax » (edismax) • edismax vs. lucene : – Cherche dans plusieurs fields en même temps – Query par defaut – + Nombre minimum de mots à matcher – + Smart boosting (proximity) • Activer edismax avec le paramètre – defType=« edismax »
  • 79. Thomas Francart, Edismax : paramètres • qf : query fields – children education – titre_en^10 resume^2 vs. titre_en^2 resume^10 • q.alt : alternative query – Souvent *:* • mm : min should match – Config avancée, voir http://wiki.apache.org/solr/DisMaxQParserPlu gin#mm_.28Minimum_.27Should.27_Match.29
  • 80. Thomas Francart, Pratique : reparamétrer le handler /browse • Commentez toutes les parties pas nécessaires : – Mlt – Facets – highlight – Spellcheck – Conserver seulement les parties « VelocityResponseWriter » et « Query settings » – Ajuster le paramètre qf • Copier les nouveaux templates Velocity dans le sous-répertoire « velocity » pour correspondre à notre schéma
  • 82. Thomas Francart, Spellcheck : configuration du schema • « Voulez-vous dire… ? » • Les suggestions orthographiques doivent se baser sur un dictionnaire : – Un fichier texte – Ou bien les valeurs d’un champ de l’index (recommandé) • En général, un champ spécifiquement dédié à cela et rempli via des copyField • stored=false • Pas de stemming • lowercasing
  • 83. Thomas Francart, Spellcheck : configuration du component • Le component « spellcheck » existe déjà dans solrconfig.xml. Ses options : – name : un nom de configuration – classname : solr.DirectSolrSpellchecker ou solr.IndexBasedSpellChecker, ou solr.FileBasedSpellChecker • solr.DirectSolrSpellchecker ne demande aucun rebuild, à préférer – spellcheckIndexDir : répertoire de stockage du dictionnaire, relatif à solr/data – buildOnCommit et buildOnOptimize : quand optimiser l’index – accuracy : entre 0 et 1; plus c’est haut, plus les corrections proposées seront proches des mots initiaux (défaut : 0.5) – distanceMeasure : algorithme de calcul de distance à utiliser – fieldType : type de field à utiliser pour analyser la query à vérifier dans le paramètre spellcheck.q
  • 84. Thomas Francart, Spellcheck : configuration du component (suite) • Pour solr.DirectSolrSpellchecker : – field : nom du champ dans lequel lire les valeurs – thresholdTokenFrequency : entre 0 et 1; pour exclure les termes qui n’apparaissent pas souvent (défaut : 0, tous les termes. A priori 0.01 élimine les mots bizarres) – maxEdits : nombre de lettres de différence autorisé (1 ou 2) différence avec accuracy ? – minPrefix : nombre de lettres communes au début du terme – minQueryLength : nombre mini de lettres dans la recherche pour déclencher un suggest • Pour solr.IndexBasedSpellChecker : – field & thresholdTokenFrequency : comme au-dessus • Pour solr.FileBasedSpellChecker : – sourceLocation : référence au fichier (1 mot par ligne) – characterEncoding : encodage du fichier • Voir http://wiki.apache.org/solr/SpellCheckComponent et http://docs.lucidworks.com/display/solr/Spell+Checking
  • 85. Thomas Francart, Spellcheck : configuration du handler • Le spellcheck component est normalement toujours ajouté à un requestHandler existant (jamais appelé séparément) <requestHandler name="/myHandler" class="solr.SearchHandler"> <lst name="defaults"> <!-- Active le specllchecking --> <str name="spellcheck">true</str> <!-- Nom du spellchecker (attribut "name") --> <str name="spellcheck.dictionary">default</str> <!-- Nombre de propositions par mot --> <str name="spellcheck.count">1</str> </lst> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler>
  • 86. Thomas Francart, Spellcheck : paramètres de query • spellcheck=true : active le spellcheck • spellcheck.dictionary : doit correspondre à « name » du component • spellcheck.count : nombre de suggestion à retourner • spellcheck.onlyMorePopular : Retourne seulement des termes de l'index + fréquents que le terme d'origine • spellcheck.extendedResults : Retourne les informations de fréquence des termes (pour du debug) • spellcheck.collate=true : dans le cas de query multi- termes, retourne en plus une suggestion de query complète aggrégant les suggestions pour chaque terme – spellcheck.maxCollations=1 nombre max de suggestions de collations – spellcheck.maxCollationsTries=0 si >0, nombre d’essais pour voir si la suggestion de collation donne des résultats (mettre à 5) – spellcheck.collateExtendedResults : ajoute des détails, pour du debug
  • 87. Thomas Francart, Spellcheck : résultats <response>… <lst name="spellcheck"> <lst name="suggestions"> <lst name="delll"> <int name="numFound">1</int> <int name="startOffset">18</int><int name="endOffset">23</int> <int name="origFreq">0</int> <arr name="suggestion“><lst> <str name="word">dell</str> <int name="freq">2</int> </lst></arr> </lst> <lst name="ultrashar"> <int name="numFound">1</int> <int name="startOffset">24</int><int name="endOffset">33</int> <int name="origFreq">0</int> <arr name="suggestion“><lst> <str name="word">ultrasharp</str> <int name="freq">2</int> </lst></arr> </lst> <bool name="correctlySpelled">false</bool> <str name="collation">price:[80 TO 100] dell ultrasharp</str> </lst> </lst> </response>
  • 89. Thomas Francart, Highlight : paramètres • hl=true – Active le highlight • hl.fl=<field1>,<field2>,<fieldN> – Liste des champs à highlighter – Par défaut, liste des champs dans le paramètre « qf » de edismax • hl.usePhraseHighlighter=true – Fait en sorte qu’une « phrase query » comme « a b c » highlighte « b » seulement dans un morceau de texte « a b c » • Beaucoup d’autres options avancées existent, voir http://wiki.apache.org/solr/HighlightingParameters
  • 90. Thomas Francart, Highlight : résultats • Le highlight est un component à part entière, et ses résultats sont donc séparés de la liste de résultat des documents en tant que telle !
  • 91. Thomas Francart, Les facettes La « killer-feature » de SolR
  • 92. Thomas Francart, Les facettes • « recherche à facette », « navigation par facettes », « recherche guidée », « recherche paramétrique » désignent la même chose : • L’enrichissement d’un résultat de recherche avec des informations aggrégées sur la liste de résultats; • Similaire à un « GROUP BY » en SQL, fait automatiquement lors d’une recherche;
  • 93. Thomas Francart, Plusieurs types de facettes • facet_fields : Facette sur valeur de champs (les plus communes) – Pour chaque valeur d’un champ, compte le nombre de résultats qui ont cette valeur; – « combien ai-je d’items par pays ? Par mot-clé ? » • facet_ranges : Facette sur plage de valeur numérique ou date – Pour une liste de plages, compte le nombre de résultats dans chaque plage; – « combien d’items font moins de 100 euros, entre 100 et 200 euros, 200 et 300 euros, plus de 300 euros ? » • facet_queries : Facette sur des query dynamiques – Pour une liste de querys, compte le nombre de résultats pour chaque queryes;
  • 94. Thomas Francart, Les facettes : contraintes • Un champ facetté doit être « indexed=true » • Un champ facetté ne doit pas être tokenisé (en général)
  • 95. Thomas Francart, Les facettes : paramètres • facet=true – Active les facettes • facet.field=<nom_du_champ> – Donne le nom d’un champ sur lequel on veut facetter – On peut répéter ce paramètre plusieurs fois pour facetter sur plusieurs champs (ce que ne permet pas l’interface d’admin)
  • 96. Thomas Francart, Les facettes : paramètres • Tous les paramètres suivants peuvent être mis : – Soit tels quels pour s’appliquer à toutes les facettes; – Soit préfixés par « f.<nom_du_champ>.<parametre> » pour s’appliquer à une seule facette; c’est préférable. • facet.sort=count ou facet.sort=index – Tri la liste de valeurs par nombre de documents associés (défaut) ou par ordre alphabétique • Exemple : f.motcle.facet.sort=index • facet.limit=100 – Nombre maxi de valeurs pour une facette (défaut : 100) • Exemple : f.motcle.facet.limit=10 • facet.mincount=1 – Nombre mini de résultats associés à une valeur pour que celle-ci s’affiche • Par défaut, mincount=0, ce qui veut dire que même les valeurs sans résultat s’affichent • Exemple : f.annee.facet.mincount=1
  • 97. Thomas Francart, Les facettes : paramètres • facet.missing=on – Inclut une valeur vide supplémentaire pour compter les résultats qui n’ont pas de valeur pour ce champ • Exemple : f.motcle.facet.missing=on • facet.offset=10 – Offset de départ dans la liste des valeurs (à combiner avec facet.limit pour paginer dans les valeurs de facettes) • Exemple : f.motcle.facet.offset=10 • facet.prefix=<chaine> (advanced) – Ne garde que les valeurs de facettes qui commencent par la chaine indiquée • Utilisée pour des facettes hiérarchiques ou de l’autocompletion
  • 98. Thomas Francart, Les facettes ranges : paramètres • facet.range=<nom_du_champ> – Fait une facette range sur un champ • Tous les paramètres suivants peuvent être mis : – Soit tels quels pour s’appliquer à toutes les facettes; – Soit préfixés par « f.<nom_du_champ>.<parametre> » pour s’appliquer à une seule facette; c’est préférable.
  • 99. Thomas Francart, Les facettes ranges : paramètres • facet.range.start=<valeur> – Valeur de début de la facette • facet.range.end=<valeur> – Valeur de fin de la facette • facet.range.gap=<valeur> – Le pas de l’itération pour chaque range (10 en 10, 5 en 5, etc.) • facet.range.hardend=true – Tronque le dernier range si facet.range.gap va au-delà de facet.range.end (défaut : false) • facet.range.other=all|none|before|after|be tween – Inclut des valeurs supplémentaires pour compte le nombre de résultats avant/après/dans la place spécifiée; « none » (par défaut » ne compte rien de plus, « all » compte avant/après/dans la place en même temps.
  • 101. Thomas Francart, Plusieurs types d’autocompletion 1. Recherche instantanée Chaque proposition correspond à un résultat de recherche 2. Suggestion de recherche basée sur les logs Chaque proposition correspond à une recherche fréquemment effectuée (à la Google) 3. Suggestion de recherche basée sur l’index Chaque proposition correspond à un terme présent dans l’index 4. Suggestion de valeur de facette Chaque proposition correspond à une valeur de facette possible (avec le nom de la facette indiquée)
  • 102. Thomas Francart, Suggestions basées sur l’index : solution 1 : facet.prefix • Les facettes peuvent être utilisées pour implémenter l’autocomplete • Attention, prends beaucoup de mémoire ! • Recherche « michael ja » – Les premiers mots de la requête sont pris comme une query normale • q=michael – On facette sur le champ texte : • facet=on • facet.field=text • facet.limit=5 (on veut 5 propositions) • facet.mincount=1 (on ne veut que des termes pour lesquels il y a effectivement un résultat) • facet.sort=count (le défaut) pour avoir les termes les plus utilisés au début de la liste – Le dernier mot incomplet est pris comme préfixe de facette, on ne veut que les valeurs de facette qui commence par ces lettres • facet.prefix=ja – On ne veut retourner que les résultats des facettes, pas les documents résultats ! • rows=0
  • 103. Thomas Francart, Suggestions basées sur l’index : solution 1 : facet.prefix …/solr/core01/select/?q=michaelfacet=on&rows=0&facet.limit=5&facet.mincou nt=1&facet.field=text&facet.sort=count&facet.prefix=ja&qt=myHandler&wt=jso n&indent=on& { "responseHeader" : { "status":0, "QTime":5}, "response":{"numFound":2498,"start":0,"docs":[]}, "facet_counts":{ "facet_queries":{}, "facet_fields": { "text":[ "jackson",18, "james",16, "jason",4, "jay",4, "jane",3 ] } } }
  • 104. Thomas Francart, Suggestions basées sur l’index : solution 2 : Suggester • Suggester : basé sur le component « Spellcheck » – Désavantage par rapport à facet.prefix : propose tous les termes, pas uniquement ceux valides par rapport au début de la recherche • Nécessite de définir un nouveau « component », qu’il faut ajouter dans un handler • Peut lire ses valeurs depuis un fichier (mais attention aux problèmes de caractères accentués) • Voir http://wiki.apache.org/solr/Suggester
  • 105. Thomas Francart, Suggestions basées sur l’index : solution 2 : Suggester <searchComponent name="suggest" class="solr.SpellCheckComponent"> <lst name="spellchecker"> <str name="name">suggest</str> <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.FSTLookupFactory</str> <str name="field">name</str> <!-- nom du champ d'index --> <float name="threshold">0.005</float> <str name="buildOnCommit">true</str> <!-- <str name="sourceLocation">chemin-vers-un-fichier.txt</str> --> </lst> </searchComponent> <requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler"> <lst name="defaults"> <str name="spellcheck">true</str> <str name="spellcheck.dictionary">suggest</str> <str name="spellcheck.onlyMorePopular">true</str> <str name="spellcheck.count">5</str> <str name="spellcheck.collate">true</str> </lst> <arr name="components"> <str>suggest</str> </arr> </requestHandler>
  • 106. Thomas Francart, L’ « élévation » Tuner manuellement les résultats
  • 107. Thomas Francart, Component « QueryElevation » • Consiste à tuner query par query les résultats ne remontant certains documents au début de la liste • Ne remplace pas une bonne configuration d’index ! Scénarios : – Corrections d’erreurs évidentes sur des recherches populaires – Mots-clés payants pour un site de pages jaunes – Choix éditoriaux pour un site de news
  • 108. Thomas Francart, QueryElevation : component <searchComponent name="elevator" class="org.apache.solr.handler.component.QueryElevationComp onent"> <!-- fieldType pour comparer 'q' au fichier de config --> <str name="queryFieldType">text</str> <!-- Référence au fichier de config dans conf --> <str name="config-file">elevate.xml</str> <!-- Force l'élévation indépendamment du param 'sort' --> <str name="forceElevation">true</str> </searchComponent> <requestHandler name="/elevate“ class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> </lst> <arr name="last-components“> <str>elevator</str> </arr> </requestHandler>
  • 109. Thomas Francart, QueryElevation : fichier de config <elevate> <query text="education"> <doc id="A" /> <doc id="B" /> <doc id="C" exclude="true" /> </query> <query text="africa"> <doc id="D" /> </query> <!-- etc... --> </elevate>
  • 110. Thomas Francart, thomas.francart@ Web de Structuration des Accès aux sparna.fr données informations connaissances