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 !

Lucene - 10 ans d'usages plus ou moins classiques

  • 1.
    LUCENE ET MOTEURSDE RECHERCHE 10 ANS D’USAGES PLUS OU MOINS CLASSIQUES Toulouse JUG – 27 juin 2013
  • 2.
    Le programme ¤  Deuxusages 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… ¨  SylvainWallez ¤  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 [email protected] 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 à jourdes 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 : lookMa, I’m on (IP) TV ! Ad engine pour Joost
  • 18.
    Joost : TV/IPpar les Skype-boys
  • 19.
    Ad engine pourla 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’unfacteur 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 : Lucenecherche l’amour… en musique T’Ecoutes Quoi ?
  • 24.
  • 25.
  • 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 deprofil ¤  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 ¨  Filtrageboolé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.
  • 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 ouElasticsearch ? ¨  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.
  • 33.