Lucene - 10 ans d'usages plus ou moins classiques

1,162 views
1,027 views

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,162
On SlideShare
0
From Embeds
0
Number of Embeds
75
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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 !

×