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 us...
A propos…
¨  Sylvain Wallez
¤  Architecte et dev expert freelance, web & Java
¤  2008-2010 : CTO de Goojet/Scoop.it
¤ ...
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...
Documentation avion Airbus
¨  Données : des centaines de PDF
¨  Entrée : du texte
¨  Sortie :
¤  Référence du document...
Documentation avion Airbus
¨  Bon, ok, on va analyser le PDF…
¤  Chance : structure du doc régulière, police fixe !
¤  ...
Construire un index
¨  Le travail du « search engine builder »
¤  80% extraire et formater la donnée
¤  10% définition ...
Construire un index
¨  Le schéma : bien plus que du typage
Doc Page Ligne Texte
CNATRA 2 1 If decision to evacuate is mad...
Fast forward à 2013 !
Middle office Cdiscount
Middle office Cdiscount
¨  Marketplace :
¤  7 millions de produits (+40k chaque mois)
¤  5.000 vendeurs
¤  4 millions ...
Middle office Cdiscount
¨  Données : des dizaines de tables SQL Server
¨  Entrée :
¨  Sortie : { "OfferId":3666756,
"Se...
Modélisation
☒ ☒ "OfferId":3666756,
☒ ☒ "SellerId":"2087",
☒ ☒ "ProductId":"RAI3295190015218",
☒ ☒ "ProductEan":"329519001...
Modélisation
¨  Champs indexés
à Pondération différente dans le scoring
¨  Pourquoi autant de champs stockés ?
à Evite...
Modélisation
¨  Autorisations d’accès : 2000 catégories/vendeur
¤  Ajouter 2000 critères n’est pas réaliste…
¨  Utilisa...
Mise à jour des données
¨  Polling périodique des bases de données
à Obtention d’un « delta » à indexer
¤  Data Import ...
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 c...
Modélisation
¨  Champs « classiques »
¤  Pays, chaîne, contenu
¨  Créneaux horaires
¤  Discrétisation en « tokens » de...
Scoring
¨  Ajout d’un facteur de scoring temps réel
¤  Mix pertinence + nombre d’impressions
à Régulation naturelle des...
Joost : bilan
¨  Utilisation « créative » de Lucene
¨  Cœur du moteur : quelques centaines de LoC
¨  Extrêmement perfor...
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 :
gen...
Modélisation
¨  Données de profil
¤  Age, date de naissance, localisation
¤  Liste d’artistes « likés »
¨  Données déd...
Requête composite
¨  Filtrage booléen : choix de l’utilisateur
¤  Sexe, âge
¨  Critères de scoring
¤  Similarité des g...
Conclusion
Un couteau suisse
¨  Full text search
¤  Complexité : agrégation et formatage des données
¨  Moteur de matching « flou ...
Lucene, Solr ou Elasticsearch ?
¨  Lucene : brique de base
¤  Moins simple à mettre en œuvre
¤  Mais donne accès à tout...
De la lecture !
Merci !
Questions ?
Réponses !
Prochain SlideShare
Chargement dans…5
×

Lucene - 10 ans d'usages plus ou moins classiques

1 199 vues

Publié le

Retour d'expérience sur 4 projets utilisant Lucene dans des contextes très différents : recherche documentaire, ecommerce, moteur de pub et matching d'affinités musicales

Publié dans : Technologie
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 199
Sur SlideShare
0
Issues des intégrations
0
Intégrations
76
Actions
Partages
0
Téléchargements
0
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Lucene - 10 ans d'usages plus ou moins classiques

  1. 1. LUCENE ET MOTEURS DE RECHERCHE 10 ANS D’USAGES PLUS OU MOINS CLASSIQUES Toulouse JUG – 27 juin 2013
  2. 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. 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. 4. Premier contact : 2003 Documentation avion Airbus
  5. 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. 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. 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. 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. 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. 10. Fast forward à 2013 ! Middle office Cdiscount
  11. 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. 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. 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. 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. 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. 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. 17. 2006 : look Ma, I’m on (IP) TV ! Ad engine pour Joost
  18. 18. Joost : TV/IP par les Skype-boys
  19. 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. 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. 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. 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. 23. 2011 : Lucene cherche l’amour… en musique T’Ecoutes Quoi ?
  24. 24. Rencontres par affinité musicale
  25. 25. Rencontres par affinité musicale
  26. 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. 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. 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
  29. 29. Conclusion
  30. 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. 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
  32. 32. De la lecture !
  33. 33. Merci ! Questions ? Réponses !

×