Lucene/Solr
Montpellier JUG 18/09/13
Olivier TAVARD
Introduction
A propos de moi :
Cofondateur de la société France Labs
Développeur
Formateur
A propos de France Labs :
Startup créée en 2011
Unique Partenaire officiel de LucidWorks et de Constellio pour la France
Introduction
Domaine: Moteurs de recherche d'entreprise Open Source
2 activités:
Consulting/support/training sur Lucene/Solr/Constellio/LucidWorks
R&D (algorithmes de ranking, connecteurs, réseaux sociaux)
Pourquoi les technologies Lucene/Solr ?
Besoins d'entreprise : avoir une bonne solution logicielle, avec un support fiable
Par conséquent notre choix de Lucene/Solr :
Large communauté autour de Lucene/Solr
Schémas de support professionnel pour Lucene/Solr
Solr 4 pensé pour le calcul distribué
Utilisé par Twitter, Linkedin, eBay, Salesforce, IBM, Apple
Architecture
La recherche est un oignon !
Architecture
La recherche est un oignon !
Architecture
La recherche est un oignon !
Architecture
Lucene
Lucene
Créé en 2000 par Doug Cutting. Version Actuelle : Lucene v. 4.4 (Juillet 2013)
Projet Open Source, Apache depuis 2001
Librairie de recherche “full-text”
Rapide, stable, performant, modulable
100% Java (pas de dépendances)
Lucene
Différence avec une base de données
Plus rapide pour récupérer un doc à partir de son contenu
Résultats scorés
Non relationnelle, structure non fixe
Champs qui peuvent contenir plusieurs
valeurs
Lucene
Un outil qui permet:
De créer un index à partir de documents
D’effectuer des
recherches dans cet index
INDEX
Lucene
Index inversé
© http://untiluknow.blogspot.com
Lucene
Scoring
Lucene
Formule paramètrable
Combinaison de
Boolean Model
Vector Space Model
• Term Frequency
• Inverse Document Frequency
• …
Scoring
Lucene
Scoring
Term Frequency (TF) :
Fréquence d’un Terme dans un document
France Labs
Bienvenue sur le site de France Labs. Créée en 2011, France Labs est une société composée d'experts en gestion de l'information. Que ce soit pour de l'expertise, pour nos produits ou pour nos solutions métiers, nous faisons en sorte que vous augmentiez votre efficacité par une meilleure exploitation de vos données.
France Labs, spécialiste des outils de recherche open source, propose des plugins innovants et des services de conseil, intégration et maintenance, sur Lucene, Solr et Constellio.
Europe, nous sommes le partenaire de Constellio, solution complète de recherche.
Lucene
Scoring
Inverse Document Frequency (IDF):
Rareté du terme dans l’ensemble du corpus
Expertise Lucene
Souhaitant intervenir plus en amont dans la vie de l’entreprise, pour vous proposer toujours plus de conseils à partir de nos expertises, Expertise & Conseil a créé Formation & Conseil : une structure de formation destinée aux acteurs de performance de l’entreprise.
Apache Lucene, la fameuse technologie pour l’indexation, la recherche et l’analyse du texte est la base de plusieurs serveurs Open Source. La présentation détaillera Solr et ElasticSearch sous la forme « Tools in Action » - démonstrations en direct des différents outils.
Document
Lucene
Field Term
Document : unité d’indexation
Field : partie d’un document, contient les données
Term : unité atomique d’un champ
Si on veut indexer un livre, on aura:
• Title : Lucene in Action
• Author : Erik Hatcher, Otis Gospodnetić
• Description : Lucene is a gem in the open-source...
• Content : …
• …
Document
Boosts:
Modifie le score d’un document
Si Boost > 1
• Score du doc plus élevé
A l’indexation:
• Peut se faire sur les champs:
- Field Boost
• Sur un document en entier:
- Document Boost
Lucene
Scoring
Boosts:
A la requête:
• Boost sur certains champs
• Boost sur certaines valeurs de la requête
• Et d’autres cas…
Lucene
Scoring
Lucene
Scoring
Boosts:
Boost sur le Titre
Fonctionnalités
Titre : Fonctionnalités Content :
Interface d'administration en HTML, Réplication, Mise en cache Recherche distribuée, Recherche à facettes, Recherche géospatiale ,API HTTP/XML, JSON et bibliothèques pour les langages de script Python et Ruby, Intégration des bases de données
Titre : Highlighter Content :
Cette fonctionnalité permet de mettre en surbrillance les termes recherchés. Ce principe est le même que les pages "en cache" de Google où les termes recherchés apparaissent surlignés en jaune.
C'est une fonctionnalité puissante et pratique.
Lucene
Récupérer les bons résultats…
… et seulement ceux là
Precision
Pourcentage de docs pertinents sur les docs retournés
Recall
Pourcentage de docs pertinents retournés sur le total des docs pertinents
Trouver un bon compromis…
Documents Pertinents
Document Retournés Documents
Pertinents
Docs retournés et pertinents
Recherche pertinente
Lucene
Indexation - Architecture
Apache Tika
© Lucene in Action, Second Edition
Lucene
2 étapes
Query Parser
Analyzer Results
Parser
Index Writer
Analyzer Index
Searcher
Lucene
Analyzer Analyzer
Chaine de composants
Extraction de termes du texte
Normaliser les données
A l'indexation/Requête WhiteSpace
Tokenizer LowerCaseFilter
…
StopFilter
…
Lucene
Différents Analyzers
© Lucene introduction, Otis Gospodnetic
Lucene
Créées programmatiquement à partir d’une interface
Créées à partir d’une chaîne de
caractères parsée par un “Query Parser”
type:voitures AND prix:[3000 TO 5000]
Lucene Query
Lucene Query
Query Parser
Requêtes – Comment les créer
Lucene
Match
Coquilles SaintJacques
WordDelimiter
Coquilles Saint Jacques
Document Analysis
coquilles saint jacques
LowerCaseFilter WhitespaceTokenizer Coquilles SaintJacques
Coquilles saint-jacques
WordDelimiter
Coquilles saint jacques
Query Analysis
coquilles saint jacques
LowerCaseFilter WhitespaceTokenizer Coquilles saint-jacques
Match
Lucene
Schema Global
© Lucene in Action, Second Edition
Lucene
"Simple" bibliothèque
Besoin d’une couche serveur et d’une UI
Pourquoi ce n’est pas suffisant?
Architecture
Solr
Solr
Lucene « embarqué » dans une webapp
Créé en 2004 par Yonik Seeley à CENT Networks
In 2006, Solr devient open-source et été cédé à la Apache Software Foundation
En 2010, fusion des projets Lucene et Solr
Version Actuelle : Sorl 4.4 (Juillet 2013)
Solr
APIs XML/HTTP de type REST
Configuration par fichiers XML
Mécanisme de Cache, Réplication
Interface admin web
Solr
Interfaces HTTP pour :
ajouter des documents (POST)
• http://localhost:8983/solr/update
effectuer des recherches (GET)
• http://localhost:8983/solr/select
Interfaces
Solr
Architecture
© www,oblady,com
Installer SOLR
Installer et tester Solr en 1 minute
Télécharger le dernier binaire (V.4.4 07/13) http://lucene.apache.org/solr/
Extraire le zip
Lancer java –jar start.jar dans apache-solr-4.4.0/example/
http://localhost:8983/solr
Solr
Functionnalités
Queries
Phrase query
Wildcard query
Range query
Proximity query
Fuzzy query
Boolean query
Solr
Functionnalités
Autocomplete
Solr
Functionnalités
Spellchecker
Solr
Functionnalités
Faceting
Solr
Functionnalités
Geospatial search
Solr
Functionnalités
More Like This
Obtenir des documents similaires à un document
Similarité textuelle
Highlighting
Synonymes
Indexer des documents
Indexer des documents
Indexer des documents
Récupérer les documents
Google Connectors
Nutch
Aperture
Préparer les documents
Convertir en XML ou JSON
Respecter le schema.xml
Peut contenir plusieurs Docs
Indexer des documents
Indexer des documents
Poster les documents par HTTP
Avec cURL (linux)
• Ex : curl http://localhost:8983/solr/collection1/update - H "Content-type:text/xml" --data-binary @mem.xml
Post.jar et Post.sh
• Ex : java -jar post.jar *.xml
Indexer des documents
Indexer des documents
Mise à jour:
Document en entier
Depuis Solr 4.0:
Modifier la valeur d’un field
Indexer des documents
Construire son schéma
Décrit les données :
Contient les champs d’un document
Et la façon de les traiter (Analyzer):
Au moment de l’indexation d’un document
Au moment de la requête
Schema.xml
Construire son schéma
Types des champs des documents à indexer
Text, String, Date….
Liste des champs des documents
Id, author, type….
Clé unique par document
Manuel
UUID
Schema.xml
Construire son schéma
Schema.xml
Construire son schéma
Exemple de schéma simple :
Voitures :
Schema.xml
Configurer Solr
SolrConfig.xml
Principal fichier de configuration de Solr
Lié à une collection
Définit les interactions avec les clients (requêtes)
• Ajout de fonctionnalités
Comportement interne du serveur
Interroger Solr (queries)
URL : select
http://localhost:8983/solr/select...
HTTP GET request
Web browser
Curl
SolrJ
…
Select
Interroger Solr
Recherche sur tout le contenu
http://localhost:8983/solr/select?q=*:*
*:* : recherche de tout sur tous les fields
1
èrerecherche
Interroger Solr
Accessible à cette URL :
http://localhost:8983/solr/admin
Complètement redesignée pour Solr 4
=>
UI Admin
Interroger Solr
UI Admin
Interroger Solr
UI Admin
Interroger Solr
1
èrerecherche
Démo !
Interroger Solr
http://localhost:8983/solr/formation/select?
q=*:*&start=0&rows=10&fl=description
/solr/ : contexte de l’application web où Solr est installé
/formation : Core de Solr
Select : request handler
Après le ? => paramètres non ordonnés
Structure de l’URL
SolrJ
SolrJ (aussi connu sous le nom de SolJava) : API pour communiquer avec Solr au travers d'applications Java
Package apache.solr.client.solrj :
ResponseParser
SolrQuery
SolrRequest
SolrResponse
SolrServer
StreamingResponseCallback
Définition
SolrJ
Simple à utiliser :
Création d'un SolrServer
Envoi de SolrQuery
Réception de SolrResponse
Définition
SolrJ
Connexion HTTP
Les données sont envoyées en javabin par défaut : gain de rapidité
Utilisation de la librairie Apache HttpComponents Client
• HttpSolrServer solr = new HttpSolrServer("serverUrl");
• ConcurrentUpdateSolrServer solr = new
ConcurrentUpdateSolrServer(solrServerUrl, queueSize, threadCount)
Communication avec le Solr server
SolrJ
Exemple :
Communication avec le serveur Solr en HTTP
Indexation de documents
Interrogation de Solr
Affichage des réponses
Exemple complet
SolrJ
Communication avec Solr en HTTP
String serverUrl =
"http://localhost:8983/solr/collection1";
HttpSolrServer server = new HttpSolrServer(serverUrl);
Exemple complet
SolrJ
Indexation
//solr.setParser(new BinaryResponseParser());
SolrInputDocument doc1 = new SolrInputDocument();
doc1.setField("id", "1");
doc1.setField("text", "hello SolrJ");
server.add(doc1);
…
solr.commit(true, true);
Exemple complet
SolrJ
Requête
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setStart(0);
query.setRows(10);
Exemple complet
SolrJ
Réponse
QueryResponse response = solr.query(query);
SolrDocumentList docs = response.getResults();
for(int i=0; i<docs.size(); i++) {
SolrDocument doc = docs.get(i);
System.out.print("id : "+doc.getFieldValue("id"));
System.out.println(" text :" + doc.getFieldValue("text"));
}
Exemple complet
SolrJ
Réponse
On obtient dans la console :
INFO: Creating new http client,
config:maxConnections=128&maxConnectionsPerH ost=32&followRedirects=false
id : 1 text : hello SolrJ id : 2 text : coucou
Exemple complet
Solr
Performances
Scaling
1 serveur Solr peut gérer
• Des millions de documents
• À peu près 1000 queries /seconde
Nous devons "scaler" si…
• Le volume de données augmente
• Le volume de queries augmente
• Haute disponibilité
Scalability
Maître
Indexing
Master
Requêtes
Replicate
Slave
Requêtes
Slave
Load Balancer
Queries
Replication
Scalability
Distributed Search
Shard3
Queries
Shard1 Shard2
Aggregated results
Subquery
Solr Cloud
Solr Cloud
Nouvelle architecture pour la scalabilité
En développement
Nouveau système de mise à l’échelle de Solr
Pack 2 en 1
• Distribution
• Réplication
Architecture flexible
Solr Cloud
Zookeeper
Logiciel de gestion de configurations pour système distribués
Contient les configs des collections pour Solr Cloud
Sauf solr.xml
Les machines s’enregistrent et se désenregistrent
Statuts des shards enregistrés
Solr Cloud
1 collection - 2 shards
Solr Cloud
1 collection - 2 shards
Première instance avec Zookeeper embarqué:
Deuxième instance:
Visualisation:
Solr Cloud
1 collection - 2 shards
Solr Cloud
1 collection - 2 shards – 2 replicas
Solr Cloud
1 collection - 2 shards – 2 replicas
Pas de Maître/Esclave
Mais Leaders et réplicas
1 Leader par shard
0 à N replicas
Elu automatiquement
Comme un replica mais avec en bonus une logique de coordination
Solr Cloud
1 collection - 2 shards – 2 replicas
Comment sont assignées les instances de Solr?
Automatiquement lors du démarrage!
Tant que numShard non atteint
• Ajout du shard N+1
• Désignation comme leader
Quand numShard atteint
• On peut commencer à indexer/chercher
• Ajout de replica au shard en possèdant le moins
Solr Cloud
Indexation
On utilise un CloudSolrServer en SolrJ
Pointé sur Zookeeper
• Transfert au shard concerné
• Indexation des docs sur le shard et ses replicas
Solr Cloud
Indexation
On envoie les docs à n’importe quelle machine
Si la machine est une replica
• Envoie les docs à son leader
Si la machine est un leader
• Si les docs concernent ce shard
- Indexation des docs sur le shard et ses replicas
• Sinon
- Transmet les docs au shard concerné
Solr Cloud
Recherche
Recherche sur n’importe quelle machine
Near Real Time
Peut avoir un délai
• Suivant que l’update arrive sur le bon shard ou non
Scalability
Solr Cloud
Solr Cloud
Solr Cloud
Avantages
Architecture très flexible
En cas d’augmentation de charge
• Ajout de machines qui pointent sur Zookeeper
En cas de diminution de charge
• Eteindre des machines
Zookeeper
Gestion centralisée des configurations
Visualisation du statut des shards
Solr Cloud
Avantages
Réplication
Automatique et fiable
Distribution automatique des MAJs
Distribution automatique des recherches
Solr Cloud
Désavantages
Indexation plus lente
Transmissions des docs entre shards
Nouvel environnement
Certaines fonctionnalités non implémentées
Non éprouvé en prod
Susceptible d’évoluer
France Labs Résumé
Expertise sur:
Lucene
Solr
Constellio