SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
0
Armand Abric
Développeur chez Virtual-Expo, Marseille
forgebinaire.net / @spyseth / github.com/spy-seth
Introduction
Solr ?
Moteur de recherche fulltext utilisant l'algorithme Lucene
= Base de données non relationnelle spécialisée dans la recherche
textuelle

Développé par la Fondation Apache
Actuellement en version 4.6.1
Interface d'administration
Communications
API REST en JSON/XML
De nombreuses librairies dans de nombreux languages :
Java, C, Ruby, Python...
...et en PHP :
Une extention PECL...
...et même des bundles Symfony 2
PECL / Solarium / NelmioSolariumBundle / SolrBundle
Structure interne Solr
schema.xml
<xlvrin"."ecdn=UF8 ?
?m eso=10 noig"T-" >
<ceanm=soe vrin"."
shm ae"tr" eso=15>
<ye>
tps
<iltp nm=srn"cas"orSril"/
fedye ae"tig ls=sl.tFed >
<ilTp nm=it cas"orItil"/
fedye ae"n" ls=sl.nFed >
<ilTp nm=dul"cas"orDulFed /
fedye ae"obe ls=sl.obeil" >
<ilTp nm=lto"cas"orLtoTp"[.]/
fedye ae"aLn ls=sl.aLnye .. >
<tps
/ye>
<ils
fed>
<il nm=i"tp=it idxd"re soe=tu"rqie=tu"/
fed ae"d ye"n" nee=tu" trd"re eurd"re >
<il nm=nm"tp=srn"idxd"re soe=fle rqie=tu"/
fed ae"ae ye"tig nee=tu" trd"as" eurd"re >
<il nm=onri"tp=it idxd"re soe=tu"mliaud"re rqie=tu"/
fed ae"we_d ye"n" nee=tu" trd"re utVle=tu" eurd"re >
<il nm=codnts tp=lto"idxd"re soe=fle rqie=tu"/
fed ae"oriae" ye"aLn nee=tu" trd"as" eurd"re >
[.]
..
<fed>
/ils
<nqee>d/nqee>
uiuKyi<uiuKy
<orurPre dfutprtr"R /
slQeyasr ealOeao=O" >
<shm>
/cea
Solr vs SGBD relationnels
Principales différences à l'usage :
Pas de jointure complexe, mais des jointures simples
Pas de sous-requêtes
Transactionnel aux coeurs du logiciel : toutes modifications de
données se fait dans une transaction (commit/rollback obligatoire)
La notion "d'égalité" varie en fonction du core et du champs sur
lequel on travaille
Un changement dans le fichier schema.xml entraine une ré-indexation
complète des données
Solr dans le SI
Un moteur de recherche vient en supplément de BDD existantes
(relationnelle, NoSQL, fichier...)
Il ne peut pas et ne doit pas remplacer une BDD "long terme"
Indexation
Indexation
L'indexation consiste à stocker des données au sein de Solr
C'est durant cette phase que Solr construit ses index internes qui lui
pemettent d'être très performant
Pour indexer des données il suffit de faire une requête HTTP sur un
requestHandler d'update du core
Les données doivent être envoyé en XML ou JSON
<d>
ad
<o>
dc
<il nm=i"S21N/il>
fed ae"d>P54<fed
<il nm=nm"SmugSiPitP2 S21N-hr die-20G<fed
fed ae"ae>asn pnon 10 P54
ad rv
5 B/il>
<il nm=ct>lcrnc<fed
fed ae"a"eetois/il>
<il nm=ct>addie/il>
fed ae"a"hr rv<fed
<il nm=faue"70RM 8Bcce IEUtaAA13/il>
fed ae"etrs>20P, M ah, D lr T-3<fed
<il nm=faue"Nieur,SlnSe tcnlg<fed
fed ae"etrs>osGad ietek ehooy/il>
<il nm=pie>2/il>
fed ae"rc"9<fed
<il nm=pplrt"6/il>
fed ae"ouaiy><fed
<il nm=iSok>re/il>
fed ae"ntc"tu<fed
<dc
/o>
<o>
dc
[.]
..
<dc
/o>
<ad
/d>
Le processus d'indexation
Il existe trois méthodes pour gérer l'indexation :
Full indexation : un bach d'indexation ré-indexe toutes les données à
interval régulier
Indexation incrémentale : un bach d'indexation indexe les
changements depuis la dernière indexation
Indexation en live : lors de la sauvegarde d'une entité dans le reste du
SI, on déclanche la mise à jour des données de l'entité au sein de Solr
Aucune n'est parfaite. Il faut choisir en fonction de ses besoins.
Plusieurs de ces techniques peuvent (doivent) être utiliser en paralelle
: il est toujours utile de pouvoir ré-indexer tout un core à partir de zéro.
Text analysis
Un vrai fieldType
<xlvrin"."ecdn=UF8 ?
?m eso=10 noig"T-" >
<- [.]->
!- .. <ilTp nm=tx_n cas"orTxFed>
fedye ae"ete" ls=sl.etil"
<nlzrtp=idx>
aaye ye"ne"
<oeie cas"orWiepcTknzratr"/
tknzr ls=sl.htsaeoeieFcoy >
<itrcas"orSnnmitratr"snnm=snnm_ntt inrCs=tu"
fle ls=sl.yoyFleFcoy yoys"yoyse.x" goeae"re
epn=tu"/
xad"re >
<itrcas"orSoFleFcoy inrCs=tu"wrs"tpod_ntt
fle ls=sl.tpitratr" goeae"re od=sowrse.x"
ealPstoIceet=tu"/
nbeoiinnrmns"re >
<itrcas"orWrDlmtritratr"gnrtWrPrs""
fle ls=sl.odeiieFleFcoy eeaeodat=1
gnrtNmePrs""ctntWrs""ctntNmes""ctntAl""
eeaeubrat=1 aeaeod=1 aeaeubr=1 aeael=0
sltnaehne""/
piOCsCag=1 >
<itrcas"orLwraeitratr"/
fle ls=sl.oeCsFleFcoy >
<itrcas"orACIodnFleFcoy/
fle ls=sl.SIFligitratr">
<itrcas"orSoblPreFleFcoy lnug=Egih /
fle ls=sl.nwalotritratr" agae"nls" >
<aaye>
/nlzr
<nlzrtp=qey>
aaye ye"ur"
<oeie cas"orWiepcTknzratr"/
tknzr ls=sl.htsaeoeieFcoy >
<itrcas"orSoFleFcoy inrCs=tu"wrs"tpod_ntt
fle ls=sl.tpitratr" goeae"re od=sowrse.x"
ealPstoIceet=tu"/
nbeoiinnrmns"re >
<itrcas"orWrDlmtritratr"gnrtWrPrs""
fle ls=sl.odeiieFleFcoy eeaeodat=1
gnrtNmePrs""ctntWrs""ctntNmes""ctntAl""
eeaeubrat=1 aeaeod=0 aeaeubr=0 aeael=0
sltnaehne""/
piOCsCag=1 >
<itrcas"orLwraeitratr"/
fle ls=sl.oeCsFleFcoy >
<itrcas"orACIodnFleFcoy/
fle ls=sl.SIFligitratr">
<itrcas"orSoblPreFleFcoy lnug=Egih /
fle ls=sl.nwalotritratr" agae"nls" >
<aaye>
/nlzr
<fedye
/ilTp>
<- [.]->
!- .. -
fieldType bis
Une partie du travail de recherche se prépare au moment de l'indexation
Il faut préparer les données pour simplifier le travail de requête :
nettoyer les caractères spéciaux
gérer des synonymes
retirer les balises HTML
gérer les accents en fonction de la langue
...
Va chercher !
Présentation de la synthaxe
ht:/oahs:93sl/cr][eusHnlr?prm]
tp/lclot88/or[oe/rqetade][aas
Paramètres de base
q : coeur de la requête de recherche
fq : clause "where" de filtre des résultats (plusieurs autorisés)
fl : liste des champs du document a retourner
rows : limit
start : offset
sort : ordonancement des résulats
Requêtes simples
ht:/oahs:93sl/rilsslc?=:
tp/lclot88/oratce/eetq**
ht:/oahs:93sl/rilsslc?=otn:ateil
tp/lclot88/oratce/eetqcnetbtlfed
&li,otn
f=dcnet
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:btlfedDC)
qcnet(ateil IE
&li,otn
f=dcnet
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:btlfedDC"
qcnet"ateil IE
&li,otn
f=dcnet
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:btlfedDC"1
qcnet"ateil IE~0
&li,otn
f=dcnet
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:ateil ADato_d2
qcnetbtlfed N uhri:
&li,otn,uhri
f=dcnetato_d
Recherches
avancées
Search revelancy
Scoring : Personaliser l'importance des clauses de match de la requête
(uniquement le paramètre "q")
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:ateil AD(uhri: O ato_d3O ato_d4
qcnetbtlfed N ato_d2 R uhri: R uhri:)
&li,otn,uhri
f=dcnetato_d

Favorisons l'auteur #2 : "a t o _ d 2 1 0
uhri:^0"
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:ateil AD(uhri:^0 O ato_d3O ato_d4
qcnetbtlfed N ato_d210 R uhri: R uhri:)
&li,otn,uhri
f=dcnetato_d
Debugging et aspirine
Relançons la requête précédente en affichant les informations de débug
"& e u Q e y t u "
dbgur=re
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:ateil AD(uhri:^0 O ato_d3O ato_d4
qcnetbtlfed N ato_d210 R uhri: R uhri:)
&li,otn,uhri
f=dcnetato_d
&euQeytu
dbgur=re
&nettu
idn=re
Grouping
Le groupement Solr est équivalant au groupement SQL
Au détail près que l'on ne peut pas grouper sur le plusieurs champs. Par
contre on peut faire plusieurs groupement différent en une requête.
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:ateil
qcnetbtlfed
&ru=re
goptu
&ru.il=aei
gopfedgm_d
&ru.ii=
goplmt3
&li,otn
f=dcnet
Faceting
Faceting
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=:
q**
&os0
rw=
&ae=re
fcttu
&ae.il=uhri
fctfedato_d
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=:
q**
&os0
rw=
&ae=re
fcttu
&ae.il=uhri
fctfedato_d
&ae.ii=
fctlmt3
Highlight
Mise en avant des termes recherchés au sein du contenus d'un champs
texte.
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:ateil
qcnetbtlfed
&lcnet
f=otn
ht:/oahs:93sl/rilsslc
tp/lclot88/oratce/eet
?=otn:ateil
qcnetbtlfed
&lcnet
f=otn
&ltu
h=re
&lqcnetbtlfed
h.=otn:ateil
&lf=otn
h.lcnet
Exemples d'autre modules
SpellCheck
Suggester (aka Autocomplete)
Recherche spaciale
Fin

Weitere ähnliche Inhalte

Ähnlich wie Solr overview presentation

Coffee script
Coffee scriptCoffee script
Coffee script
antho1404
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
goldoraf
 

Ähnlich wie Solr overview presentation (20)

SPARQL_1.1
SPARQL_1.1SPARQL_1.1
SPARQL_1.1
 
Diaporama du sfPot Lillois du 20 mars 2014
Diaporama du sfPot Lillois du 20 mars 2014Diaporama du sfPot Lillois du 20 mars 2014
Diaporama du sfPot Lillois du 20 mars 2014
 
Coffee script
Coffee scriptCoffee script
Coffee script
 
BBL chez Mappy autour de Tsung
BBL chez Mappy autour de TsungBBL chez Mappy autour de Tsung
BBL chez Mappy autour de Tsung
 
Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012
 
Drools
DroolsDrools
Drools
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Cours php
Cours phpCours php
Cours php
 
Python packaging
Python packagingPython packaging
Python packaging
 
Enrichissement des moteurs de recherche: technologie
Enrichissement des moteurs de recherche: technologieEnrichissement des moteurs de recherche: technologie
Enrichissement des moteurs de recherche: technologie
 
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops) Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
Terraform OpenStack : Mise en pratique sur infrastructure OVH (Rennes devops)
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Spring 3.0
Spring 3.0Spring 3.0
Spring 3.0
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014
 
20111006 bonnes pratiques-gi_g_v1
20111006 bonnes pratiques-gi_g_v120111006 bonnes pratiques-gi_g_v1
20111006 bonnes pratiques-gi_g_v1
 
le ‘futur’ du web à la lecture des recommandations du W3C
le ‘futur’ du web à la lecture des recommandations du W3Cle ‘futur’ du web à la lecture des recommandations du W3C
le ‘futur’ du web à la lecture des recommandations du W3C
 
Un web ouvert, Paris Web 2009
Un web ouvert, Paris Web 2009Un web ouvert, Paris Web 2009
Un web ouvert, Paris Web 2009
 

Solr overview presentation

  • 1. 0
  • 2. Armand Abric Développeur chez Virtual-Expo, Marseille forgebinaire.net / @spyseth / github.com/spy-seth
  • 4. Solr ? Moteur de recherche fulltext utilisant l'algorithme Lucene = Base de données non relationnelle spécialisée dans la recherche textuelle Développé par la Fondation Apache Actuellement en version 4.6.1
  • 6. Communications API REST en JSON/XML De nombreuses librairies dans de nombreux languages : Java, C, Ruby, Python... ...et en PHP : Une extention PECL... ...et même des bundles Symfony 2 PECL / Solarium / NelmioSolariumBundle / SolrBundle
  • 8. schema.xml <xlvrin"."ecdn=UF8 ? ?m eso=10 noig"T-" > <ceanm=soe vrin"." shm ae"tr" eso=15> <ye> tps <iltp nm=srn"cas"orSril"/ fedye ae"tig ls=sl.tFed > <ilTp nm=it cas"orItil"/ fedye ae"n" ls=sl.nFed > <ilTp nm=dul"cas"orDulFed / fedye ae"obe ls=sl.obeil" > <ilTp nm=lto"cas"orLtoTp"[.]/ fedye ae"aLn ls=sl.aLnye .. > <tps /ye> <ils fed> <il nm=i"tp=it idxd"re soe=tu"rqie=tu"/ fed ae"d ye"n" nee=tu" trd"re eurd"re > <il nm=nm"tp=srn"idxd"re soe=fle rqie=tu"/ fed ae"ae ye"tig nee=tu" trd"as" eurd"re > <il nm=onri"tp=it idxd"re soe=tu"mliaud"re rqie=tu"/ fed ae"we_d ye"n" nee=tu" trd"re utVle=tu" eurd"re > <il nm=codnts tp=lto"idxd"re soe=fle rqie=tu"/ fed ae"oriae" ye"aLn nee=tu" trd"as" eurd"re > [.] .. <fed> /ils <nqee>d/nqee> uiuKyi<uiuKy <orurPre dfutprtr"R / slQeyasr ealOeao=O" > <shm> /cea
  • 9. Solr vs SGBD relationnels Principales différences à l'usage : Pas de jointure complexe, mais des jointures simples Pas de sous-requêtes Transactionnel aux coeurs du logiciel : toutes modifications de données se fait dans une transaction (commit/rollback obligatoire) La notion "d'égalité" varie en fonction du core et du champs sur lequel on travaille Un changement dans le fichier schema.xml entraine une ré-indexation complète des données
  • 10. Solr dans le SI Un moteur de recherche vient en supplément de BDD existantes (relationnelle, NoSQL, fichier...) Il ne peut pas et ne doit pas remplacer une BDD "long terme"
  • 12. Indexation L'indexation consiste à stocker des données au sein de Solr C'est durant cette phase que Solr construit ses index internes qui lui pemettent d'être très performant Pour indexer des données il suffit de faire une requête HTTP sur un requestHandler d'update du core Les données doivent être envoyé en XML ou JSON <d> ad <o> dc <il nm=i"S21N/il> fed ae"d>P54<fed <il nm=nm"SmugSiPitP2 S21N-hr die-20G<fed fed ae"ae>asn pnon 10 P54 ad rv 5 B/il> <il nm=ct>lcrnc<fed fed ae"a"eetois/il> <il nm=ct>addie/il> fed ae"a"hr rv<fed <il nm=faue"70RM 8Bcce IEUtaAA13/il> fed ae"etrs>20P, M ah, D lr T-3<fed <il nm=faue"Nieur,SlnSe tcnlg<fed fed ae"etrs>osGad ietek ehooy/il> <il nm=pie>2/il> fed ae"rc"9<fed <il nm=pplrt"6/il> fed ae"ouaiy><fed <il nm=iSok>re/il> fed ae"ntc"tu<fed <dc /o> <o> dc [.] .. <dc /o> <ad /d>
  • 13. Le processus d'indexation Il existe trois méthodes pour gérer l'indexation : Full indexation : un bach d'indexation ré-indexe toutes les données à interval régulier Indexation incrémentale : un bach d'indexation indexe les changements depuis la dernière indexation Indexation en live : lors de la sauvegarde d'une entité dans le reste du SI, on déclanche la mise à jour des données de l'entité au sein de Solr Aucune n'est parfaite. Il faut choisir en fonction de ses besoins. Plusieurs de ces techniques peuvent (doivent) être utiliser en paralelle : il est toujours utile de pouvoir ré-indexer tout un core à partir de zéro.
  • 15. Un vrai fieldType <xlvrin"."ecdn=UF8 ? ?m eso=10 noig"T-" > <- [.]-> !- .. <ilTp nm=tx_n cas"orTxFed> fedye ae"ete" ls=sl.etil" <nlzrtp=idx> aaye ye"ne" <oeie cas"orWiepcTknzratr"/ tknzr ls=sl.htsaeoeieFcoy > <itrcas"orSnnmitratr"snnm=snnm_ntt inrCs=tu" fle ls=sl.yoyFleFcoy yoys"yoyse.x" goeae"re epn=tu"/ xad"re > <itrcas"orSoFleFcoy inrCs=tu"wrs"tpod_ntt fle ls=sl.tpitratr" goeae"re od=sowrse.x" ealPstoIceet=tu"/ nbeoiinnrmns"re > <itrcas"orWrDlmtritratr"gnrtWrPrs"" fle ls=sl.odeiieFleFcoy eeaeodat=1 gnrtNmePrs""ctntWrs""ctntNmes""ctntAl"" eeaeubrat=1 aeaeod=1 aeaeubr=1 aeael=0 sltnaehne""/ piOCsCag=1 > <itrcas"orLwraeitratr"/ fle ls=sl.oeCsFleFcoy > <itrcas"orACIodnFleFcoy/ fle ls=sl.SIFligitratr"> <itrcas"orSoblPreFleFcoy lnug=Egih / fle ls=sl.nwalotritratr" agae"nls" > <aaye> /nlzr <nlzrtp=qey> aaye ye"ur" <oeie cas"orWiepcTknzratr"/ tknzr ls=sl.htsaeoeieFcoy > <itrcas"orSoFleFcoy inrCs=tu"wrs"tpod_ntt fle ls=sl.tpitratr" goeae"re od=sowrse.x" ealPstoIceet=tu"/ nbeoiinnrmns"re > <itrcas"orWrDlmtritratr"gnrtWrPrs"" fle ls=sl.odeiieFleFcoy eeaeodat=1 gnrtNmePrs""ctntWrs""ctntNmes""ctntAl"" eeaeubrat=1 aeaeod=0 aeaeubr=0 aeael=0 sltnaehne""/ piOCsCag=1 > <itrcas"orLwraeitratr"/ fle ls=sl.oeCsFleFcoy > <itrcas"orACIodnFleFcoy/ fle ls=sl.SIFligitratr"> <itrcas"orSoblPreFleFcoy lnug=Egih / fle ls=sl.nwalotritratr" agae"nls" > <aaye> /nlzr <fedye /ilTp> <- [.]-> !- .. -
  • 16. fieldType bis Une partie du travail de recherche se prépare au moment de l'indexation Il faut préparer les données pour simplifier le travail de requête : nettoyer les caractères spéciaux gérer des synonymes retirer les balises HTML gérer les accents en fonction de la langue ...
  • 19. Paramètres de base q : coeur de la requête de recherche fq : clause "where" de filtre des résultats (plusieurs autorisés) fl : liste des champs du document a retourner rows : limit start : offset sort : ordonancement des résulats
  • 22. Search revelancy Scoring : Personaliser l'importance des clauses de match de la requête (uniquement le paramètre "q") ht:/oahs:93sl/rilsslc tp/lclot88/oratce/eet ?=otn:ateil AD(uhri: O ato_d3O ato_d4 qcnetbtlfed N ato_d2 R uhri: R uhri:) &li,otn,uhri f=dcnetato_d Favorisons l'auteur #2 : "a t o _ d 2 1 0 uhri:^0" ht:/oahs:93sl/rilsslc tp/lclot88/oratce/eet ?=otn:ateil AD(uhri:^0 O ato_d3O ato_d4 qcnetbtlfed N ato_d210 R uhri: R uhri:) &li,otn,uhri f=dcnetato_d
  • 23. Debugging et aspirine Relançons la requête précédente en affichant les informations de débug "& e u Q e y t u " dbgur=re ht:/oahs:93sl/rilsslc tp/lclot88/oratce/eet ?=otn:ateil AD(uhri:^0 O ato_d3O ato_d4 qcnetbtlfed N ato_d210 R uhri: R uhri:) &li,otn,uhri f=dcnetato_d &euQeytu dbgur=re &nettu idn=re
  • 24. Grouping Le groupement Solr est équivalant au groupement SQL Au détail près que l'on ne peut pas grouper sur le plusieurs champs. Par contre on peut faire plusieurs groupement différent en une requête. ht:/oahs:93sl/rilsslc tp/lclot88/oratce/eet ?=otn:ateil qcnetbtlfed &ru=re goptu &ru.il=aei gopfedgm_d &ru.ii= goplmt3 &li,otn f=dcnet
  • 27. Highlight Mise en avant des termes recherchés au sein du contenus d'un champs texte. ht:/oahs:93sl/rilsslc tp/lclot88/oratce/eet ?=otn:ateil qcnetbtlfed &lcnet f=otn ht:/oahs:93sl/rilsslc tp/lclot88/oratce/eet ?=otn:ateil qcnetbtlfed &lcnet f=otn &ltu h=re &lqcnetbtlfed h.=otn:ateil &lf=otn h.lcnet
  • 29. Fin