SlideShare une entreprise Scribd logo
1  sur  33
LUCENE ET MOTEURS DE RECHERCHE
10 ANS D’USAGES PLUS
OU MOINS CLASSIQUES
Toulouse JUG – 27 juin 2013
Le programme
¤  Deux usages classiques
n  Documentation avion Airbus (2003)
n  Marketplace Cdiscount (2013)
¤  Deux usages moins classiques
n  Moteur de publicité pour de la TV sur IP
n  Matching d’affinité musicale pour un site de rencontre
A propos…
¨  Sylvain Wallez
¤  Architecte et dev expert freelance, web & Java
¤  2008-2010 : CTO de Goojet/Scoop.it
¤  2006-2008 : Backend architect Joost
¤  2000-2008 : cofondateur & CTO
Anyware Technologies
¤  2003 : premier VP français de la fondation
Apache
sylvain@bluxte.net
http://bluxte.net
Twitter: @bluxte
Premier contact : 2003
Documentation avion Airbus
Documentation avion Airbus
¨  Données : des centaines de PDF
¨  Entrée : du texte
¨  Sortie :
¤  Référence du document
¤  N° de page
¤  N° d’alinea !
Documentation avion Airbus
¨  Données : des centaines de PDF
¨  Entrée : du texte
¨  Sortie :
¤  Référence du document
¤  N° de page
¤  N° d’alinea !
Documentation avion Airbus
¨  Bon, ok, on va analyser le PDF…
¤  Chance : structure du doc régulière, police fixe !
¤  Librairie Etymon PJ : un « DOM » pour le PDF
Doc Page Ligne Texte
CNATRA 2 1 If decision to evacuate is made…
CNATRA 2 2 If directed by CNATRA, execut…
CNATRA 2 3 COR II (Winds in excess of 50…
CNATRA 2 4 Send decision to Evacuate e-m…
CNATRA 2 5 Terminate all syllabus and cros…
CNATRA 2 6 When directed by CNATRA, ex…
Construire un index
¨  Le travail du « search engine builder »
¤  80% extraire et formater la donnée
¤  10% définition du schéma d’indexation
¤  10% expression des requêtes
Construire un index
¨  Le schéma : bien plus que du typage
Doc Page Ligne Texte
CNATRA 2 1 If decision to evacuate is made…
CNATRA 2 2 If directed by CNATRA, execut…
CNATRA 2 3 COR II (Winds in excess of 50…
CNATRA 2 4 Send decision to Evacuate e-m…
CNATRA 2 5 Terminate all syllabus and cros…
CNATRA 2 6 When directed by CNATRA, ex…
Indexé : non
Stocké : oui Indexé : tokens, stemming, stop words
Stocké : non
Indexé : non
Stocké : oui
Indexé : non
Stocké : oui
Fast forward à 2013 !
Middle office Cdiscount
Middle office Cdiscount
¨  Marketplace :
¤  7 millions de produits (+40k chaque mois)
¤  5.000 vendeurs
¤  4 millions d’offres
¨  Objectifs :
¤  Recherche dans le catalogue produit
¤  Recherche et comparaison des offres
¤  … avec des autorisations par vendeur
¤  Cluster de serveurs Solr
Middle office Cdiscount
¨  Données : des dizaines de tables SQL Server
¨  Entrée :
¨  Sortie : { "OfferId":3666756,
"SellerId":"2087",
"ProductId":"RAI3295190015218",
"ProductEan":"3295190015218",
"SellerProductId":"335191200",
"OfferState":2,
"ProductState":1,
"ProductConditionId":6,
"Price":15.92,
"BestShippingCharges":9.95,
"BestOfferId":2885830,
"BestOfferPrice":22.44,
"BestOfferShippingCharges":0.0,
"BestOfferConditionId":6,
"LastUpdateDate":"2013-03-05T11:55:23.867Z",
"RemainingQuantity":150,
"DisplayName":"Chemises Rock's assorties par 100",
"ShortDescription":"Chemises Rock's assorties par 100 - Teintes vives.",
"ProductUrl":"/au-quotidien/papeterie/f-127051001-RAI3295190015218.html”
}
Modélisation
☒ ☒ "OfferId":3666756,
☒ ☒ "SellerId":"2087",
☒ ☒ "ProductId":"RAI3295190015218",
☒ ☒ "ProductEan":"3295190015218",
☒ ☒ "SellerProductId":"335191200",
☒ ☒ "OfferState":2,
☐ ☒ "ProductState":1,
☐ ☒ "ProductConditionId":6,
☒ ☒ "Price":15.92,
☐ ☒ "BestShippingCharges":9.95,
☐ ☒ "BestOfferId":2885830,
☒ ☒ "BestOfferPrice":22.44,
☐ ☒ "BestOfferShippingCharges":0.0,
☐ ☒ "BestOfferConditionId":6,
☒ ☒ "LastUpdateDate":"2013-03-05T11:55:23.867Z",
☐ ☒ "RemainingQuantity":150,
☒ ☒ "DisplayName":"Chemises Rock's assorties par 100",
☒ ☒ "ShortDescription":"Chemises Rock's assorties par 100...",
☐ ☒ "ProductUrl":"/au-quotidien/papeterie/f-127051001-...”
Indexé Stocké
Modélisation
¨  Champs indexés
à Pondération différente dans le scoring
¨  Pourquoi autant de champs stockés ?
à Eviter les requêtes en base pour l’affichage des
résultats !
ProductEan OR ProductId OR DisplayName OR ShortDescription^0.5
Modélisation
¨  Autorisations d’accès : 2000 catégories/vendeur
¤  Ajouter 2000 critères n’est pas réaliste…
¨  Utilisation des « Query Filter » Lucene
¤  Une liste d’identifiants de documents précalculée
¤  Sert de « masque » lors de la recherche
à Limitation à un sous-espace des données
Mise à jour des données
¨  Polling périodique des bases de données
à Obtention d’un « delta » à indexer
¤  Data Import Handler dans Solr
¤  River dans Elasticsearch
¤  … mais on finit souvent avec une solution custom
2006 : look Ma, I’m on (IP) TV !
Ad engine pour Joost
Joost : TV/IP par les Skype-boys
Ad engine pour la TV
¨  Données : campagnes de pub
¤  Pays, jours de la semaine, plages horaires
¤  Chaînes, types de contenu
¤  Dates de début/fin, nombre d’impressions cibles
¨  Entrée : contexte utilisateur
¤  Pays, heure locale, chaîne, contenu, historique
¨  Sortie : une pub à afficher
Modélisation
¨  Champs « classiques »
¤  Pays, chaîne, contenu
¨  Créneaux horaires
¤  Discrétisation en « tokens » de 15 minutes
à Renforce la pertinence des plages courtes
¨  Query ???
¤  L’utilisateur et son contexte sont la query !
Scoring
¨  Ajout d’un facteur de scoring temps réel
¤  Mix pertinence + nombre d’impressions
à Régulation naturelle des impressions
progress = (now - timeStart) / (timeEnd – timeStart)
expectedImpressions = maxImpressions * progress
rate = expectedImpressions / currentImpressions
score = matchScore * rate
Score Lucene
Compteur
temps réel
Joost : bilan
¨  Utilisation « créative » de Lucene
¨  Cœur du moteur : quelques centaines de LoC
¨  Extrêmement performant
¨  Pas mal de paramètres à régler
2011 : Lucene cherche l’amour… en musique
T’Ecoutes Quoi ?
Rencontres par affinité musicale
Rencontres par affinité musicale
Le problème
¨  Données :
¤  Profil Facebook :
nom, sexe, ville, likes d’artistes
¤  Meta-données sur les artistes :
genres, artistes similaires, popularité
¨  Entrée : profil utilisateur + critères
¨  Résultats :
¤  liste de profils avec « température »
Modélisation
¨  Données de profil
¤  Age, date de naissance, localisation
¤  Liste d’artistes « likés »
¨  Données déduites
¤  Genres des artistes
¤  Artistes similaires
¨  Préférences
¤  Genre et âge des personnes recherchées
Requête composite
¨  Filtrage booléen : choix de l’utilisateur
¤  Sexe, âge
¨  Critères de scoring
¤  Similarité des goûts musicaux
n  Intersection des artistes
n  Intersection des genres
¤  Plage d’âge compatible
¤  Distance géographique
Conclusion
Un couteau suisse
¨  Full text search
¤  Complexité : agrégation et formatage des données
¨  Moteur de matching « flou »
¤  Usages très nombreux, développement rapide et
résultats pertinents
¤  Soyez créatifs !
Lucene, Solr ou Elasticsearch ?
¨  Lucene : brique de base
¤  Moins simple à mettre en œuvre
¤  Mais donne accès à toutes les « power features »
¤  Connaître ses concepts pour maîtriser ES ou Solr !
¨  Elasticsearch
¤  Taillé pour le clustering !
¤  Moins de features que Solr
¨  Solr
¤  Clustering plus « lourd »
¤  Ultra-customizable
De la lecture !
Merci !
Questions ?
Réponses !

Contenu connexe

Similaire à Lucene - 10 ans d'usages plus ou moins classiques

HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...
HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...
HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...Nadia Berg
 
Elasticsearch - Esme sudria
Elasticsearch - Esme sudriaElasticsearch - Esme sudria
Elasticsearch - Esme sudriaDavid Pilato
 
Lausanne JUG - Elasticsearch
Lausanne JUG - ElasticsearchLausanne JUG - Elasticsearch
Lausanne JUG - ElasticsearchDavid Pilato
 
Symposium2008 Open Source 08 02 2008
Symposium2008    Open Source   08 02 2008Symposium2008    Open Source   08 02 2008
Symposium2008 Open Source 08 02 2008juflo
 
Normandy JUG - Elasticsearch
Normandy JUG - ElasticsearchNormandy JUG - Elasticsearch
Normandy JUG - ElasticsearchDavid Pilato
 
Poitou charentes JUG - Elasticsearch
Poitou charentes JUG - ElasticsearchPoitou charentes JUG - Elasticsearch
Poitou charentes JUG - ElasticsearchDavid Pilato
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity frameworkDNG Consulting
 
Introduction à Neo4j
Introduction à Neo4jIntroduction à Neo4j
Introduction à Neo4jNeo4j
 
Azure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delà
Azure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delàAzure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delà
Azure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delàMicrosoft
 
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...Jean-Pierre Riehl
 
Track 2 - Atelier 2 - Introduction à redshift
Track 2 - Atelier 2 - Introduction à redshiftTrack 2 - Atelier 2 - Introduction à redshift
Track 2 - Atelier 2 - Introduction à redshiftAmazon Web Services
 
SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...
SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...
SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...SEARCH Y - Philippe Yonnet Evénements
 
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2Horacio Gonzalez
 
SPA avec SignalR et Angular Js
SPA avec SignalR et Angular JsSPA avec SignalR et Angular Js
SPA avec SignalR et Angular JsMicrosoft
 
SQL Server et les développeurs
SQL Server et les développeurs SQL Server et les développeurs
SQL Server et les développeurs Microsoft
 
Génération automatique de texte
Génération automatique de texteGénération automatique de texte
Génération automatique de texteEstelle Delpech
 
Comment l’architecture événementielle révolutionne la communication dans le S...
Comment l’architecture événementielle révolutionne la communication dans le S...Comment l’architecture événementielle révolutionne la communication dans le S...
Comment l’architecture événementielle révolutionne la communication dans le S...Vincent Lepot
 
Paris data geek - Elasticsearch
Paris data geek - ElasticsearchParis data geek - Elasticsearch
Paris data geek - ElasticsearchDavid Pilato
 
Nantes JUG - Elasticsearch
Nantes JUG - ElasticsearchNantes JUG - Elasticsearch
Nantes JUG - ElasticsearchDavid Pilato
 

Similaire à Lucene - 10 ans d'usages plus ou moins classiques (20)

HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...
HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...
HISTOIRE ET PANORAMA DU WEB À DESTINATION DES PROFESSIONNELS DE L'IMAGE ET DE...
 
Elasticsearch - Esme sudria
Elasticsearch - Esme sudriaElasticsearch - Esme sudria
Elasticsearch - Esme sudria
 
Lausanne JUG - Elasticsearch
Lausanne JUG - ElasticsearchLausanne JUG - Elasticsearch
Lausanne JUG - Elasticsearch
 
Symposium2008 Open Source 08 02 2008
Symposium2008    Open Source   08 02 2008Symposium2008    Open Source   08 02 2008
Symposium2008 Open Source 08 02 2008
 
Normandy JUG - Elasticsearch
Normandy JUG - ElasticsearchNormandy JUG - Elasticsearch
Normandy JUG - Elasticsearch
 
Poitou charentes JUG - Elasticsearch
Poitou charentes JUG - ElasticsearchPoitou charentes JUG - Elasticsearch
Poitou charentes JUG - Elasticsearch
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity framework
 
Introduction à Neo4j
Introduction à Neo4jIntroduction à Neo4j
Introduction à Neo4j
 
Azure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delà
Azure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delàAzure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delà
Azure: que puis-je faire pour 0€, 1€, 1000€, un million d’€ et au-delà
 
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
 
Track 2 - Atelier 2 - Introduction à redshift
Track 2 - Atelier 2 - Introduction à redshiftTrack 2 - Atelier 2 - Introduction à redshift
Track 2 - Atelier 2 - Introduction à redshift
 
SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...
SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...
SEARCH Y - Bing : Frédéric Dubut et Fabrice Canel - Crawl et Indexation, les ...
 
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2Enib   cours c.a.i. web - séance #1 - html5 css3-js - 2
Enib cours c.a.i. web - séance #1 - html5 css3-js - 2
 
SPA avec SignalR et Angular Js
SPA avec SignalR et Angular JsSPA avec SignalR et Angular Js
SPA avec SignalR et Angular Js
 
SQL Server et les développeurs
SQL Server et les développeurs SQL Server et les développeurs
SQL Server et les développeurs
 
Génération automatique de texte
Génération automatique de texteGénération automatique de texte
Génération automatique de texte
 
Comment l’architecture événementielle révolutionne la communication dans le S...
Comment l’architecture événementielle révolutionne la communication dans le S...Comment l’architecture événementielle révolutionne la communication dans le S...
Comment l’architecture événementielle révolutionne la communication dans le S...
 
Utc data publica1
Utc data publica1Utc data publica1
Utc data publica1
 
Paris data geek - Elasticsearch
Paris data geek - ElasticsearchParis data geek - Elasticsearch
Paris data geek - Elasticsearch
 
Nantes JUG - Elasticsearch
Nantes JUG - ElasticsearchNantes JUG - Elasticsearch
Nantes JUG - Elasticsearch
 

Plus de Sylvain Wallez

Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVMSylvain Wallez
 
Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGSylvain Wallez
 
Developing web applications in Rust
Developing web applications in RustDeveloping web applications in Rust
Developing web applications in RustSylvain Wallez
 
Black friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchBlack friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchSylvain Wallez
 
Elastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamElastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamSylvain Wallez
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Sylvain Wallez
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
Kibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackKibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackSylvain Wallez
 
2016 05 iot - apero web
2016 05 iot - apero web2016 05 iot - apero web
2016 05 iot - apero webSylvain Wallez
 
Brown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastBrown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastSylvain Wallez
 
2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open HardwareSylvain Wallez
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Sylvain Wallez
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro EditionSylvain Wallez
 

Plus de Sylvain Wallez (13)

Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVM
 
Inside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUGInside the JVM - Follow the white rabbit! / Breizh JUG
Inside the JVM - Follow the white rabbit! / Breizh JUG
 
Developing web applications in Rust
Developing web applications in RustDeveloping web applications in Rust
Developing web applications in Rust
 
Black friday logs - Scaling Elasticsearch
Black friday logs - Scaling ElasticsearchBlack friday logs - Scaling Elasticsearch
Black friday logs - Scaling Elasticsearch
 
Elastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering teamElastic - From 50 to 270, how to scale a distributed engineering team
Elastic - From 50 to 270, how to scale a distributed engineering team
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Kibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stackKibana + timelion: time series with the elastic stack
Kibana + timelion: time series with the elastic stack
 
2016 05 iot - apero web
2016 05 iot - apero web2016 05 iot - apero web
2016 05 iot - apero web
 
Brown Bag Lunch sur Hazelcast
Brown Bag Lunch sur HazelcastBrown Bag Lunch sur Hazelcast
Brown Bag Lunch sur Hazelcast
 
2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware2012 11 Toulibre - Open Hardware
2012 11 Toulibre - Open Hardware
 
Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011Play Framework - Toulouse JUG - nov 2011
Play Framework - Toulouse JUG - nov 2011
 
Développement avec Java Micro Edition
Développement avec Java Micro EditionDéveloppement avec Java Micro Edition
Développement avec Java Micro Edition
 

Lucene - 10 ans d'usages plus ou moins classiques

  • 1. LUCENE ET MOTEURS DE RECHERCHE 10 ANS D’USAGES PLUS OU MOINS CLASSIQUES Toulouse JUG – 27 juin 2013
  • 2. Le programme ¤  Deux usages classiques n  Documentation avion Airbus (2003) n  Marketplace Cdiscount (2013) ¤  Deux usages moins classiques n  Moteur de publicité pour de la TV sur IP n  Matching d’affinité musicale pour un site de rencontre
  • 3. A propos… ¨  Sylvain Wallez ¤  Architecte et dev expert freelance, web & Java ¤  2008-2010 : CTO de Goojet/Scoop.it ¤  2006-2008 : Backend architect Joost ¤  2000-2008 : cofondateur & CTO Anyware Technologies ¤  2003 : premier VP français de la fondation Apache sylvain@bluxte.net http://bluxte.net Twitter: @bluxte
  • 4. Premier contact : 2003 Documentation avion Airbus
  • 5. Documentation avion Airbus ¨  Données : des centaines de PDF ¨  Entrée : du texte ¨  Sortie : ¤  Référence du document ¤  N° de page ¤  N° d’alinea !
  • 6. Documentation avion Airbus ¨  Données : des centaines de PDF ¨  Entrée : du texte ¨  Sortie : ¤  Référence du document ¤  N° de page ¤  N° d’alinea !
  • 7. Documentation avion Airbus ¨  Bon, ok, on va analyser le PDF… ¤  Chance : structure du doc régulière, police fixe ! ¤  Librairie Etymon PJ : un « DOM » pour le PDF Doc Page Ligne Texte CNATRA 2 1 If decision to evacuate is made… CNATRA 2 2 If directed by CNATRA, execut… CNATRA 2 3 COR II (Winds in excess of 50… CNATRA 2 4 Send decision to Evacuate e-m… CNATRA 2 5 Terminate all syllabus and cros… CNATRA 2 6 When directed by CNATRA, ex…
  • 8. Construire un index ¨  Le travail du « search engine builder » ¤  80% extraire et formater la donnée ¤  10% définition du schéma d’indexation ¤  10% expression des requêtes
  • 9. Construire un index ¨  Le schéma : bien plus que du typage Doc Page Ligne Texte CNATRA 2 1 If decision to evacuate is made… CNATRA 2 2 If directed by CNATRA, execut… CNATRA 2 3 COR II (Winds in excess of 50… CNATRA 2 4 Send decision to Evacuate e-m… CNATRA 2 5 Terminate all syllabus and cros… CNATRA 2 6 When directed by CNATRA, ex… Indexé : non Stocké : oui Indexé : tokens, stemming, stop words Stocké : non Indexé : non Stocké : oui Indexé : non Stocké : oui
  • 10. Fast forward à 2013 ! Middle office Cdiscount
  • 11. Middle office Cdiscount ¨  Marketplace : ¤  7 millions de produits (+40k chaque mois) ¤  5.000 vendeurs ¤  4 millions d’offres ¨  Objectifs : ¤  Recherche dans le catalogue produit ¤  Recherche et comparaison des offres ¤  … avec des autorisations par vendeur ¤  Cluster de serveurs Solr
  • 12. Middle office Cdiscount ¨  Données : des dizaines de tables SQL Server ¨  Entrée : ¨  Sortie : { "OfferId":3666756, "SellerId":"2087", "ProductId":"RAI3295190015218", "ProductEan":"3295190015218", "SellerProductId":"335191200", "OfferState":2, "ProductState":1, "ProductConditionId":6, "Price":15.92, "BestShippingCharges":9.95, "BestOfferId":2885830, "BestOfferPrice":22.44, "BestOfferShippingCharges":0.0, "BestOfferConditionId":6, "LastUpdateDate":"2013-03-05T11:55:23.867Z", "RemainingQuantity":150, "DisplayName":"Chemises Rock's assorties par 100", "ShortDescription":"Chemises Rock's assorties par 100 - Teintes vives.", "ProductUrl":"/au-quotidien/papeterie/f-127051001-RAI3295190015218.html” }
  • 13. Modélisation ☒ ☒ "OfferId":3666756, ☒ ☒ "SellerId":"2087", ☒ ☒ "ProductId":"RAI3295190015218", ☒ ☒ "ProductEan":"3295190015218", ☒ ☒ "SellerProductId":"335191200", ☒ ☒ "OfferState":2, ☐ ☒ "ProductState":1, ☐ ☒ "ProductConditionId":6, ☒ ☒ "Price":15.92, ☐ ☒ "BestShippingCharges":9.95, ☐ ☒ "BestOfferId":2885830, ☒ ☒ "BestOfferPrice":22.44, ☐ ☒ "BestOfferShippingCharges":0.0, ☐ ☒ "BestOfferConditionId":6, ☒ ☒ "LastUpdateDate":"2013-03-05T11:55:23.867Z", ☐ ☒ "RemainingQuantity":150, ☒ ☒ "DisplayName":"Chemises Rock's assorties par 100", ☒ ☒ "ShortDescription":"Chemises Rock's assorties par 100...", ☐ ☒ "ProductUrl":"/au-quotidien/papeterie/f-127051001-...” Indexé Stocké
  • 14. Modélisation ¨  Champs indexés à Pondération différente dans le scoring ¨  Pourquoi autant de champs stockés ? à Eviter les requêtes en base pour l’affichage des résultats ! ProductEan OR ProductId OR DisplayName OR ShortDescription^0.5
  • 15. Modélisation ¨  Autorisations d’accès : 2000 catégories/vendeur ¤  Ajouter 2000 critères n’est pas réaliste… ¨  Utilisation des « Query Filter » Lucene ¤  Une liste d’identifiants de documents précalculée ¤  Sert de « masque » lors de la recherche à Limitation à un sous-espace des données
  • 16. Mise à jour des données ¨  Polling périodique des bases de données à Obtention d’un « delta » à indexer ¤  Data Import Handler dans Solr ¤  River dans Elasticsearch ¤  … mais on finit souvent avec une solution custom
  • 17. 2006 : look Ma, I’m on (IP) TV ! Ad engine pour Joost
  • 18. Joost : TV/IP par les Skype-boys
  • 19. Ad engine pour la TV ¨  Données : campagnes de pub ¤  Pays, jours de la semaine, plages horaires ¤  Chaînes, types de contenu ¤  Dates de début/fin, nombre d’impressions cibles ¨  Entrée : contexte utilisateur ¤  Pays, heure locale, chaîne, contenu, historique ¨  Sortie : une pub à afficher
  • 20. Modélisation ¨  Champs « classiques » ¤  Pays, chaîne, contenu ¨  Créneaux horaires ¤  Discrétisation en « tokens » de 15 minutes à Renforce la pertinence des plages courtes ¨  Query ??? ¤  L’utilisateur et son contexte sont la query !
  • 21. Scoring ¨  Ajout d’un facteur de scoring temps réel ¤  Mix pertinence + nombre d’impressions à Régulation naturelle des impressions progress = (now - timeStart) / (timeEnd – timeStart) expectedImpressions = maxImpressions * progress rate = expectedImpressions / currentImpressions score = matchScore * rate Score Lucene Compteur temps réel
  • 22. Joost : bilan ¨  Utilisation « créative » de Lucene ¨  Cœur du moteur : quelques centaines de LoC ¨  Extrêmement performant ¨  Pas mal de paramètres à régler
  • 23. 2011 : Lucene cherche l’amour… en musique T’Ecoutes Quoi ?
  • 26. Le problème ¨  Données : ¤  Profil Facebook : nom, sexe, ville, likes d’artistes ¤  Meta-données sur les artistes : genres, artistes similaires, popularité ¨  Entrée : profil utilisateur + critères ¨  Résultats : ¤  liste de profils avec « température »
  • 27. Modélisation ¨  Données de profil ¤  Age, date de naissance, localisation ¤  Liste d’artistes « likés » ¨  Données déduites ¤  Genres des artistes ¤  Artistes similaires ¨  Préférences ¤  Genre et âge des personnes recherchées
  • 28. Requête composite ¨  Filtrage booléen : choix de l’utilisateur ¤  Sexe, âge ¨  Critères de scoring ¤  Similarité des goûts musicaux n  Intersection des artistes n  Intersection des genres ¤  Plage d’âge compatible ¤  Distance géographique
  • 30. Un couteau suisse ¨  Full text search ¤  Complexité : agrégation et formatage des données ¨  Moteur de matching « flou » ¤  Usages très nombreux, développement rapide et résultats pertinents ¤  Soyez créatifs !
  • 31. Lucene, Solr ou Elasticsearch ? ¨  Lucene : brique de base ¤  Moins simple à mettre en œuvre ¤  Mais donne accès à toutes les « power features » ¤  Connaître ses concepts pour maîtriser ES ou Solr ! ¨  Elasticsearch ¤  Taillé pour le clustering ! ¤  Moins de features que Solr ¨  Solr ¤  Clustering plus « lourd » ¤  Ultra-customizable