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
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
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
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
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
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