SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
[ Rencontres Mondiales du Logiciel Libre 2011 – Lundi 11 juillet 2011 ]

             Développement d'un moteur de
                recherche avec Zend Search
                                     Auteur : Dr Ir Robert Viseur
Qui suis-je ?

• Robert Viseur
  • Ingénieur Civil, Mastère en Management de l'Innovation,
    Docteur en Sciences Appliquées.
  • Spécialisé dans les questions relatives à l'économie des
    logiciels libres et aux pratiques de co-création, ainsi que
    dans les technologies de recherche et de traitement de
    l'information (outils d'indexation, API,...).
  • Responsable de l'annuaire de prestataires
    logiciellibre.com.
  • Assistant à la Faculté Polytechnique de l'Université de
    Mons (www.umons.ac.be).
  • Conseiller technologique au CETIC (www.cetic.be).
                                                                  2
Qu'est-ce que le CETIC ?

• Centre d'Excellence en Technologies de l'Information et
  de la Communication basé à Charleroi (Belgique).
• Trois départements (et types de services) :
   • Software & System Engineering : qualité logicielle
     (fiabilité, sécurité, respect des normes internationales,
     processus,...).
   • Software & Services Technologies : architectures
     orientées services et sémantique.
   • Embedded & Communication Systems : prototypage de
     systèmes embarqués communicants et nouvelles
     technologies électroniques.


                                                                 3
Introduction




           4
De quoi allons-nous parler ?

• Sujet : création d'un moteur de recherche utilisant
  les technologies « wget » et « Zend Search » (version
  PHP de Lucene).

• Plan :
   • Présentation des outils (wget, Lucene, Zend Search).
   • Mise en œuvre (encodage UTF-8 sous PHP, Zend Search
     en pratique,...).
   • Quelques exemples.
   • Conclusion.

                                                            5
Outils




     6
Wget (1)

• Utilitaire GNU en ligne de commande, compatible
  Linux ou Cygwin, permettant de récupérer des
  fichiers en utilisant HTTP, HTTPS et FTP.
• Commande de base :
  • wget www.cetic.be
     • Stocke localement la page située à l'adresse
       « www.cetic.be ».
• Commande pour un crawl :
  • wget -r -l2 -P www -R jpg,gif,png 'http://www.cetic.be'
     • Crawl récursif de profondeur 2 pour le site
       « http://www.cetic.be » et résultats du crawl dans le répertoire
       « www » (+ rejet des photos).
                                                                      7
Wget (2)

• Multiples options :
   • -r (crawl récursif)
        • Par défaut : respect de la convention « norobots »
   •   -l (profondeur de récursion)
   •   -P (répertoire cible pour le stockage)
   •   -A et -R (filtrage des URLs par pattern)
   •   --user-agent (« user agent » imposé)
   •   ...
• Plus d'infos : http://www.gnu.org/software/wget/manual/ .
• Alternative : curl (puissant mais... pas de crawl
  récursif).
                                                                 8
Lucene (1)

• Outil d'indexation supporté par la fondation Apache
  (lucene.apache.org).
• Ecosystème étendu :
   • Utilisé dans Alfresco, Jahia, Liferay,...
   • Extension au cloud (ex. : CouchDB-lucene).
   • Beaucoup d'outils tiers : Luke (lecture d'un index),
     Solr (serveur de recherche ; sans crawler), Nutch
     (moteur de recherche avec crawler), Carrot2
     (interface de recherche compatible OpenSearch et
     Solr),...
   • Cf. http://wiki.apache.org/lucene-java/PoweredBy .
                                                            9
Lucene (2)

• Le format d'index est devenu une sorte de
  standard.
  • Nombreux portages : Lucene.Net (. Net), PyLucene
    (Python), CLucene (C++) Plucene (Perl), Zend
    Search (PHP),...
  • Différents types de portages : par traduction
    littérale (compatibilité d'API d'abord), par
    traduction optimisée pour le langage cible
    (performances d'abord) et par binding (Python).
  • Points à surveiller : couverture fonctionnelle,
    version de l'index,...
                                                       10
Zend Search (1)

• Portage de Lucene en PHP.
  • API spécifique.
  • Support de la version d'index 2.3 (depuis Zend
    Framework 1.6).
  • Support de l'UTF-8 en interne.
  • Intégré au framework Zend mais utilisable
    séparément (taille sur disque : 734,3 ko).
  • Taille d'index théorique maximum = 2GB (système 32
    bits).
  • Facilement hébergeable (installable sur un
    hébergement mutualisé type OVH ou Lost Oasis).
                                                         11
Zend Search (2)

• Plusieurs types de champs supportés :
  « Keyword », « UnIndexed », « Binary », « Text »
  et « UnStored ».




                                                     12
Zend Search (3)

• Syntaxe supportée lors des recherches :
    • Opérateurs booléens (« OR » ou « || », « AND » ou « && »,
      « NOT » ou «  ! », « + », « - »),
    • indicateur de champs (« title: »),
    • jokers (« ? » ou « * »),
    • recherche par intervalle (dates ou chaines),
    • recherche floue (« ~ »),
    • recherches de proximité (« ~ »),
    • facteur de boost (« ^ »).
• Possibilité de trier par champs.
• Cf. http://framework.zend.com/manual/fr/zend.search.lucene.searching.html et
  http://framework.zend.com/manual/fr/zend.search.lucene.query-language.html .


                                                                                 13
Zend Search (4)

• Possibilité de personnaliser l'analyse des documents :
   • Utilisation d'un analyseur par défaut
     (Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive).
   • Possibilité de choisir un analyseur (compatible UTF-8,
     compatible avec les nombres,...).
   • Possibilité de configurer des filtres (« lowercase »,
     « stop words », « short words »).
   • Possibilité de créer son propre analyseur.
   • Cf. http://framework.zend.com/manual/fr/zend.search.lucene.extending.html .
• Possibilité de chargement direct de documents :
  formats HTML, MS Word / Powerpoint / Excel,...
                                                                                   14
Divers

• Autres outils utiles (pour un moteur de recherche) :
   • En CLI :
      • PDFtoText : conversion d'un document PDF en texte brut.
   • En PHP :
      • SimplePie (simplepie.org) : lecteur RSS robuste.
      • GeoIP PHP API (www.maxmind.com): géolocalisation d'adresses IP (cf. « pure
        PHP module »).
      • Dans PEAR :
           – PEAR Text_LanguageDetect (pear.php.net) : détection de la langue d'une phrase.
      • Dans Zend :
           – Zend_Paginator : gestion des pages (collection de données).
           – Zend_Tag : création d'un nuage de tags.
           – Zend_Service : passerelles vers plusieurs API populaires (Delicious,
             Twitter,...).
   • ...
                                                                                          15
Mise en oeuvre




             16
Encodage UTF-8 sous PHP (1)

• PHP 5 (et <5) travaille en ISO-8859-1.
• Problème ?
   • L'UTF-8 permet de présenter davantage de jeux de caractères que
     l'ISO 8859-1 mais...
   • L'UTF-8 stocke les caractères sur 1 ou plusieurs octets (1 seul en ISO-
     8859-1).
• Donc ?
   • L'UTF-8 est mieux adapté à l'Internet.
   • La chaîne d'outils utilisés (éditeur, langage de script, base de
     données, navigateur,...) doit connaître l'encodage utilisé pour
     comprendre les chaînes.
        • Exemple de problème : « Archive — Little I dreamed of being like L©guman ...
          now I eat carrots ».
• Cf.   http://openweb.eu.org/articles/jeux_caracteres   .
                                                                                          17
Encodage UTF-8 sous PHP (2)

• Dans PHP :
  • La logique est différente de celle de Python, qui propose un
    type « string » et un type « Unicode ». PHP est très faiblement
    typé et travaille uniquement avec des chaines.
  • La conversion entre ISO et UTF-8 se fait à l'aide des fonctions
    « utf8_encode() » et « utf8_decode() ». Les autres conversions
    se font via « iconv ».
  • La manipulation des chaines en UTF-8 se fait à l'aide de la
    bibliothèque « mbstring ».
• La détermination de l'encodage des caractères en entrée
  n'est pas triviale (headers HTTP parfois erronés,
  métadonnées HTML parfois absentes ou erronées, outils de
  détection pas toujours fiables,...).
                                                                  18
Zend Search (1)

• Création d'un index et insertion :
     $index = Zend_Search_Lucene::create('/data/my-index');
     $doc = new Zend_Search_Lucene_Document();
     $doc->addField(Zend_Search_Lucene_Field::Text('title', $docTitle));
     $doc->addField(Zend_Search_Lucene_Field::UnIndexed('url', $docUrl));
     $doc->addField(Zend_Search_Lucene_Field::UnStored('content',
$docContent));
     $index->addDocument($doc);
     $index->commit() ;



• Optimisation de l'index :
     $index->optimize();

                                                                            19
Zend Search (2)

• Ouverture d'un index et recherche :
   $index = Zend_Search_Lucene::open('/data/my-index') ;
   $query = Zend_Search_Lucene_Search_QueryParser::parse($input);
   $hits    = $index->find($query);
   foreach ($hits as $hit) {
       echo $hit->score;
       echo $hit->title;
       echo $hit->url;
   }



• Paramètres : opérateur par défaut, encodage des
  données,...

                                                                    20
Divers

• Attention : wget affecte conventionnellement le nom « index.html » à
  l'adresse « / ».
• Analyse des documents HTML :
   • native (cf. « Zend_Search_Lucene_Document_Html »),
   • manuelle non structurée (extraction des métadonnées -title, description,...-
     par expressions régulières et nettoyage du <body> via « strip_tags ») ou...
   • manuelle structurée (extraction structurée par expression régulière ou Xpath).
• Lucene ne gère pas les contraintes d'intégrité.
   • Les doublons ne peuvent donc pas être évités via un champ « UNIQUE ».
   • Or, hash utile sur l'URL, voire sur le contenu (duplicate content).
   • Solutions possibles : test sur un champ unique dans l'index ou test sur base
     d'une table externe (ex. : hash dans SQLite).




                                                                                      21
Exemple : indexation de flux RSS

• Indexation de flux RSS (retronimo.com).
   • Collecte des URLs des flux RSS et Atom via un crawler
     multithread Python.
   • Lecture, indexation et interface de recherche en PHP.
       • Lecture des flux RSS avec SimplePie, localisation du serveur
         avec GeoIP et détection de la langue sur base de liste de
         « stop words ».




                                                                    22
Exemple : pages HTML (1)




                       23
Exemple : pages HTML (2)

• Étape 1 : constituer une base de données d'URLs (basé sur
  logiciellibre.com).

• Étape 2 :
   • Détecter les éventuelles redirections, sites morts, etc
     (automatisable sous PHP avec « get_headers »).
   • Générer les requêtes wget correspondantes.
   • Lancer le crawl avec « wget ».
• Étape 3 : lancer l'indexation des pages collectées par « wget ».

• Utilité : identifier les prestataires actifs sur une ou plusieurs
  technologies particulières (cf. thème « Entreprises »).



                                                                      24
Exemple : pages HTML (3)

• Performances :
Active index: index-fr:
 Create index:
   From 30-06-2011 13:39:16 to 30-06-2011 13:44:28.
   Size of the index: 4299 document(s) and 35,5Mo.
   Time: 258,957s. (60,237ms./doc.).
 Optimization time: 49,154s.
 Tests:
   Search (test): 25 result(s) (max.: 25) in 10,130ms. for 'python'.
   Search (test): 69 result(s) (max.: 250) in 4,425ms. for 'python'.
   Search (test): 25 result(s) (max.: 25) in 11,798ms. for 'python AND plone'.
   Search (test): 27 result(s) (max.: 250) in 7,111ms. for 'python AND NOT plone'.
   Search (test): 102 result(s) (max.: 250) in 8,569ms. for 'python OR plone^4'.




                                                                                     25
Conclusion




         26
Conclusion (1)

• Grande facilité d'intégration dans un programme PHP. Supporté sur la
  plupart des hébergements LAMP, même mutualisés.
• Réponses pertinentes. Grande richesse du langage d'interrogation.
  Interprétation des requêtes.
• Possibilité de choisir et de personnaliser les analyseurs de texte.
• Fonctionnement correct pour des index de taille limitée :
  • Fragilité de l'index lors d'une forte sollicitation en insertion (requêtes
    simultanées) depuis une application Web (risque d'index corrompu à partir
    de 5000 documents environ) mais...
  • Problème constaté sous Windows XP et pas sous Ubuntu (?).




                                                                                 27
Conclusion (2)

• Deux tests réalisés :
   • Insertions simultanées depuis une application Web
     (requêtes sur « localhost »).
      • Index : 12.065 documents (contenus RSS) et 22 Mo.
   • Insertions séquentielles depuis la ligne de
     commande (« php monscript.php »).
      • Index : 15.790 documents (pages HTML) et 167,5 Mo.
      • Dans ce cas : lancement sur serveur si accès
        « administrateur » ou synchronisation de l'index depuis un
        poste local (par exemple via synchronisation FTP, cf.
        LFTP).


                                                                     28
Merci!



Merci pour votre attention.

     Des questions ?




                                   29
Quelques ressources




                  30
Outils

•   SQLite (www.sqlite.org).
•   WampServer (www.wampserver.com).
•   Lucene (lucene.apache.org).
•   Zend framework (framework.zend.com).
•   SolR (lucene.apache.org/solr/).
•   Carrot² (project.carrot2.org).
•   Luke (www.getopt.org/luke/).
•   Nutch (nutch.apache.org).
•   Tesseract (tesseract-ocr.googlecode.com).

                                                     31
Ressources et liens utiles

• Robert Viseur (2010). "Introduction to libre « fulltext »
  technology". RMLL 2010. URL :
  http://www.robertviseur.be/news-20100710.php .
• Erik Hatcher et Otis Gospodnetić (2004). "Lucene in
  Action". Manning Publications Co.
• Moteur de recherche avec Zend Search Lucene. URL :
  http://www.libre-a-vous.fr/moteur-recherche-zend-
  search-lucene/ .
• GNU Wget. URL:
  http://www.gnu.org/software/wget/manual/ .
• Introduction aux jeux de caractères. URL:
  http://openweb.eu.org/articles/jeux_caracteres .
                                                              32
Contact

• Dr Ir Robert Viseur.
• Email : robert.viseur@cetic.be
• Phone : 0032 (0) 479 66 08 76




           Cette présentation est diffusée sous licence « CC-BY ».
                                                                           33

Contenu connexe

Tendances

Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGDavid Pilato
 
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchMoteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchAudrey Neveu
 
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearchBesoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearchfrancelabs
 
Presentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGPresentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGfrancelabs
 
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshopMigrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshopNuxeo
 
JABES 2017 - L'histoire d'un document dans la plate-forme ISTEX
JABES 2017 - L'histoire d'un document dans la plate-forme ISTEXJABES 2017 - L'histoire d'un document dans la plate-forme ISTEX
JABES 2017 - L'histoire d'un document dans la plate-forme ISTEXABES
 
SdE TP 3 - Fonctions d'entrée et sortie
SdE TP 3 - Fonctions d'entrée et sortieSdE TP 3 - Fonctions d'entrée et sortie
SdE TP 3 - Fonctions d'entrée et sortieAlexandru Radovici
 
Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012David Pilato
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireAlexandru Radovici
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promessesEric Toguem
 
Introduction à ERRest
Introduction à ERRestIntroduction à ERRest
Introduction à ERRestWO Community
 

Tendances (17)

Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUG
 
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchMoteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic Search
 
Solr formation Sparna
Solr formation SparnaSolr formation Sparna
Solr formation Sparna
 
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearchBesoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
 
Presentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGPresentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUG
 
SdE 3 - Systemes de fichiers
SdE 3 - Systemes de fichiersSdE 3 - Systemes de fichiers
SdE 3 - Systemes de fichiers
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 
SdE 6 - Gestion de la memoire
SdE 6 - Gestion de la memoireSdE 6 - Gestion de la memoire
SdE 6 - Gestion de la memoire
 
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshopMigrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
 
JABES 2017 - L'histoire d'un document dans la plate-forme ISTEX
JABES 2017 - L'histoire d'un document dans la plate-forme ISTEXJABES 2017 - L'histoire d'un document dans la plate-forme ISTEX
JABES 2017 - L'histoire d'un document dans la plate-forme ISTEX
 
SdE TP 3 - Fonctions d'entrée et sortie
SdE TP 3 - Fonctions d'entrée et sortieSdE TP 3 - Fonctions d'entrée et sortie
SdE TP 3 - Fonctions d'entrée et sortie
 
Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012
 
SdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoireSdE 2 - Langage C, Allocation de memoire
SdE 2 - Langage C, Allocation de memoire
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promesses
 
SdE2 4 - Processus
SdE2 4 - ProcessusSdE2 4 - Processus
SdE2 4 - Processus
 
Introduction à ERRest
Introduction à ERRestIntroduction à ERRest
Introduction à ERRest
 

En vedette

Les moteurs de recherche verticaux
Les moteurs de recherche verticauxLes moteurs de recherche verticaux
Les moteurs de recherche verticauxAref Jdey
 
Internationaliser un formulaire zend form
Internationaliser un formulaire zend formInternationaliser un formulaire zend form
Internationaliser un formulaire zend formGeozend
 
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)cornnery
 
Presentation pfe 2012
Presentation pfe 2012Presentation pfe 2012
Presentation pfe 2012Sellami Ahmed
 
Conception et réalisation d’un Système d’information des étudiants du départe...
Conception et réalisation d’un Système d’information des étudiants du départe...Conception et réalisation d’un Système d’information des étudiants du départe...
Conception et réalisation d’un Système d’information des étudiants du départe...Ilyas CHAOUA
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Presentation orale d’un mémoire
Presentation orale d’un mémoirePresentation orale d’un mémoire
Presentation orale d’un mémoireNjeugna
 
Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...
Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...
Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...Arnold Stellio
 
Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2
Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2
Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2Sofien Benrhouma
 

En vedette (11)

Les moteurs de recherche verticaux
Les moteurs de recherche verticauxLes moteurs de recherche verticaux
Les moteurs de recherche verticaux
 
Internationaliser un formulaire zend form
Internationaliser un formulaire zend formInternationaliser un formulaire zend form
Internationaliser un formulaire zend form
 
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
 
Presentation pfe 2012
Presentation pfe 2012Presentation pfe 2012
Presentation pfe 2012
 
Conception et réalisation d’un Système d’information des étudiants du départe...
Conception et réalisation d’un Système d’information des étudiants du départe...Conception et réalisation d’un Système d’information des étudiants du départe...
Conception et réalisation d’un Système d’information des étudiants du départe...
 
Les CMS basés sur framework - PHP Tour 2011
Les CMS basés sur framework - PHP Tour 2011Les CMS basés sur framework - PHP Tour 2011
Les CMS basés sur framework - PHP Tour 2011
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Rapport PFE - B.Sc IT
Rapport PFE -  B.Sc ITRapport PFE -  B.Sc IT
Rapport PFE - B.Sc IT
 
Presentation orale d’un mémoire
Presentation orale d’un mémoirePresentation orale d’un mémoire
Presentation orale d’un mémoire
 
Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...
Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...
Memoire de fin d'études pour le diplome de Chef de Projet Informatique et Rés...
 
Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2
Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2
Rapport Projet De Fin D'étude Développent d'une application web avec Symfony2
 

Similaire à Développement d'un moteur de recherche avec Zend Search

Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - ElasticsearchDavid Pilato
 
Annexe1 éTude Comparative Sur Les Moteurs De Recherche
Annexe1   éTude Comparative Sur Les Moteurs De RechercheAnnexe1   éTude Comparative Sur Les Moteurs De Recherche
Annexe1 éTude Comparative Sur Les Moteurs De RechercheMohamed Ben Bouzid
 
PHP/ExtJs experience feedback - IAV case - 1
PHP/ExtJs experience feedback - IAV case - 1PHP/ExtJs experience feedback - IAV case - 1
PHP/ExtJs experience feedback - IAV case - 1fayway
 
Présentation de Robot framework
Présentation de Robot frameworkPrésentation de Robot framework
Présentation de Robot frameworkgilleslenfant
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernancegdigugli
 
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc BouchoCellenza
 
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris AZUG FR
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPjulien pauli
 
Javascript & tools
Javascript & toolsJavascript & tools
Javascript & toolsSlim Soussi
 
Introduction à l'Open Hardware
Introduction à l'Open HardwareIntroduction à l'Open Hardware
Introduction à l'Open HardwareRobert Viseur
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Laurent Guérin
 
Comprendre, utiliser et créer une API
Comprendre, utiliser et créer une APIComprendre, utiliser et créer une API
Comprendre, utiliser et créer une APIOlivia Reaney
 
Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012David Pilato
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesChristophe Furmaniak
 
Geneva jug Lucene Solr
Geneva jug Lucene Solr Geneva jug Lucene Solr
Geneva jug Lucene Solr francelabs
 
Développement mobile multi-plateforme avec Flutter
Développement mobile multi-plateforme avec FlutterDéveloppement mobile multi-plateforme avec Flutter
Développement mobile multi-plateforme avec Fluttererick G
 
De l'Open Source à l'Open API (in French)
De l'Open Source à l'Open API (in French)De l'Open Source à l'Open API (in French)
De l'Open Source à l'Open API (in French)Restlet
 

Similaire à Développement d'un moteur de recherche avec Zend Search (20)

Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - Elasticsearch
 
Annexe1 éTude Comparative Sur Les Moteurs De Recherche
Annexe1   éTude Comparative Sur Les Moteurs De RechercheAnnexe1   éTude Comparative Sur Les Moteurs De Recherche
Annexe1 éTude Comparative Sur Les Moteurs De Recherche
 
GetText / Rails - FR
GetText / Rails - FRGetText / Rails - FR
GetText / Rails - FR
 
GetText / Rails
GetText / RailsGetText / Rails
GetText / Rails
 
PHP/ExtJs experience feedback - IAV case - 1
PHP/ExtJs experience feedback - IAV case - 1PHP/ExtJs experience feedback - IAV case - 1
PHP/ExtJs experience feedback - IAV case - 1
 
Présentation de Robot framework
Présentation de Robot frameworkPrésentation de Robot framework
Présentation de Robot framework
 
Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernance
 
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
 
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Javascript & tools
Javascript & toolsJavascript & tools
Javascript & tools
 
Introduction à l'Open Hardware
Introduction à l'Open HardwareIntroduction à l'Open Hardware
Introduction à l'Open Hardware
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Comprendre, utiliser et créer une API
Comprendre, utiliser et créer une APIComprendre, utiliser et créer une API
Comprendre, utiliser et créer une API
 
Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantes
 
Geneva jug Lucene Solr
Geneva jug Lucene Solr Geneva jug Lucene Solr
Geneva jug Lucene Solr
 
Développement mobile multi-plateforme avec Flutter
Développement mobile multi-plateforme avec FlutterDéveloppement mobile multi-plateforme avec Flutter
Développement mobile multi-plateforme avec Flutter
 
De l'Open Source à l'Open API (in French)
De l'Open Source à l'Open API (in French)De l'Open Source à l'Open API (in French)
De l'Open Source à l'Open API (in French)
 

Plus de Robert Viseur

La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...
La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...
La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...Robert Viseur
 
L'écosystème régional du Big Data
L'écosystème régional du Big DataL'écosystème régional du Big Data
L'écosystème régional du Big DataRobert Viseur
 
Piloter son appareil photo numérique avec des logiciels libres
Piloter son appareil photo  numérique avec des logiciels  libresPiloter son appareil photo  numérique avec des logiciels  libres
Piloter son appareil photo numérique avec des logiciels libresRobert Viseur
 
Exploiter les données issues de Wikipedia
Exploiter les données issues de WikipediaExploiter les données issues de Wikipedia
Exploiter les données issues de WikipediaRobert Viseur
 
De l’open source à l’open cloud
De l’open source à l’open cloudDe l’open source à l’open cloud
De l’open source à l’open cloudRobert Viseur
 
Développer ses photos avec RawTherapee
Développer ses photos avec RawTherapeeDévelopper ses photos avec RawTherapee
Développer ses photos avec RawTherapeeRobert Viseur
 
Convertir ses photos en N/B avec Gimp
Convertir ses photos en N/B avec GimpConvertir ses photos en N/B avec Gimp
Convertir ses photos en N/B avec GimpRobert Viseur
 
L'open hardware : l'ouverture au service de l'innovation
L'open hardware : l'ouverture au service de l'innovationL'open hardware : l'ouverture au service de l'innovation
L'open hardware : l'ouverture au service de l'innovationRobert Viseur
 
Pechakucha (Mons) : Street Art à Mons
Pechakucha (Mons) : Street Art à MonsPechakucha (Mons) : Street Art à Mons
Pechakucha (Mons) : Street Art à MonsRobert Viseur
 
L'open hardware dans l'électronique (et au delà...)
L'open hardware dans l'électronique (et au delà...)L'open hardware dans l'électronique (et au delà...)
L'open hardware dans l'électronique (et au delà...)Robert Viseur
 
Analyse des concepts de Fab Lab, Living Lab et Hub créatif
Analyse des concepts de Fab Lab, Living Lab et Hub créatifAnalyse des concepts de Fab Lab, Living Lab et Hub créatif
Analyse des concepts de Fab Lab, Living Lab et Hub créatifRobert Viseur
 
Open Source Hardware for Dummies
Open Source Hardware for DummiesOpen Source Hardware for Dummies
Open Source Hardware for DummiesRobert Viseur
 
Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...
Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...
Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...Robert Viseur
 
Etude du secteur des prestataires FLOSS en Belgique
Etude du secteur des prestataires FLOSS en BelgiqueEtude du secteur des prestataires FLOSS en Belgique
Etude du secteur des prestataires FLOSS en BelgiqueRobert Viseur
 
Hacker son appareil photo avec des outils libres
Hacker son appareil photo avec des outils libresHacker son appareil photo avec des outils libres
Hacker son appareil photo avec des outils libresRobert Viseur
 
Comment gérer le risque de lock-in technique en cas d'usage de services de cl...
Comment gérer le risque de lock-in technique en cas d'usage de services de cl...Comment gérer le risque de lock-in technique en cas d'usage de services de cl...
Comment gérer le risque de lock-in technique en cas d'usage de services de cl...Robert Viseur
 
Hacker son appareil photo, c'est possible !
Hacker son appareil photo, c'est possible !Hacker son appareil photo, c'est possible !
Hacker son appareil photo, c'est possible !Robert Viseur
 
Comprendre les licences de logiciels libres
Comprendre les licences de logiciels libresComprendre les licences de logiciels libres
Comprendre les licences de logiciels libresRobert Viseur
 
Impact of cloud computing on FOSS editors
Impact of cloud computing on FOSS editorsImpact of cloud computing on FOSS editors
Impact of cloud computing on FOSS editorsRobert Viseur
 
Une introduction à la co-création dans le domaine des TIC
Une introduction à la co-création dans le domaine des TICUne introduction à la co-création dans le domaine des TIC
Une introduction à la co-création dans le domaine des TICRobert Viseur
 

Plus de Robert Viseur (20)

La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...
La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...
La PI dans les espaces de co-création et d'innovation ouverte. Propriété inte...
 
L'écosystème régional du Big Data
L'écosystème régional du Big DataL'écosystème régional du Big Data
L'écosystème régional du Big Data
 
Piloter son appareil photo numérique avec des logiciels libres
Piloter son appareil photo  numérique avec des logiciels  libresPiloter son appareil photo  numérique avec des logiciels  libres
Piloter son appareil photo numérique avec des logiciels libres
 
Exploiter les données issues de Wikipedia
Exploiter les données issues de WikipediaExploiter les données issues de Wikipedia
Exploiter les données issues de Wikipedia
 
De l’open source à l’open cloud
De l’open source à l’open cloudDe l’open source à l’open cloud
De l’open source à l’open cloud
 
Développer ses photos avec RawTherapee
Développer ses photos avec RawTherapeeDévelopper ses photos avec RawTherapee
Développer ses photos avec RawTherapee
 
Convertir ses photos en N/B avec Gimp
Convertir ses photos en N/B avec GimpConvertir ses photos en N/B avec Gimp
Convertir ses photos en N/B avec Gimp
 
L'open hardware : l'ouverture au service de l'innovation
L'open hardware : l'ouverture au service de l'innovationL'open hardware : l'ouverture au service de l'innovation
L'open hardware : l'ouverture au service de l'innovation
 
Pechakucha (Mons) : Street Art à Mons
Pechakucha (Mons) : Street Art à MonsPechakucha (Mons) : Street Art à Mons
Pechakucha (Mons) : Street Art à Mons
 
L'open hardware dans l'électronique (et au delà...)
L'open hardware dans l'électronique (et au delà...)L'open hardware dans l'électronique (et au delà...)
L'open hardware dans l'électronique (et au delà...)
 
Analyse des concepts de Fab Lab, Living Lab et Hub créatif
Analyse des concepts de Fab Lab, Living Lab et Hub créatifAnalyse des concepts de Fab Lab, Living Lab et Hub créatif
Analyse des concepts de Fab Lab, Living Lab et Hub créatif
 
Open Source Hardware for Dummies
Open Source Hardware for DummiesOpen Source Hardware for Dummies
Open Source Hardware for Dummies
 
Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...
Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...
Pratiques innovantes dans le secteur automobile: du champion de produit à l'i...
 
Etude du secteur des prestataires FLOSS en Belgique
Etude du secteur des prestataires FLOSS en BelgiqueEtude du secteur des prestataires FLOSS en Belgique
Etude du secteur des prestataires FLOSS en Belgique
 
Hacker son appareil photo avec des outils libres
Hacker son appareil photo avec des outils libresHacker son appareil photo avec des outils libres
Hacker son appareil photo avec des outils libres
 
Comment gérer le risque de lock-in technique en cas d'usage de services de cl...
Comment gérer le risque de lock-in technique en cas d'usage de services de cl...Comment gérer le risque de lock-in technique en cas d'usage de services de cl...
Comment gérer le risque de lock-in technique en cas d'usage de services de cl...
 
Hacker son appareil photo, c'est possible !
Hacker son appareil photo, c'est possible !Hacker son appareil photo, c'est possible !
Hacker son appareil photo, c'est possible !
 
Comprendre les licences de logiciels libres
Comprendre les licences de logiciels libresComprendre les licences de logiciels libres
Comprendre les licences de logiciels libres
 
Impact of cloud computing on FOSS editors
Impact of cloud computing on FOSS editorsImpact of cloud computing on FOSS editors
Impact of cloud computing on FOSS editors
 
Une introduction à la co-création dans le domaine des TIC
Une introduction à la co-création dans le domaine des TICUne introduction à la co-création dans le domaine des TIC
Une introduction à la co-création dans le domaine des TIC
 

Développement d'un moteur de recherche avec Zend Search

  • 1. [ Rencontres Mondiales du Logiciel Libre 2011 – Lundi 11 juillet 2011 ] Développement d'un moteur de recherche avec Zend Search Auteur : Dr Ir Robert Viseur
  • 2. Qui suis-je ? • Robert Viseur • Ingénieur Civil, Mastère en Management de l'Innovation, Docteur en Sciences Appliquées. • Spécialisé dans les questions relatives à l'économie des logiciels libres et aux pratiques de co-création, ainsi que dans les technologies de recherche et de traitement de l'information (outils d'indexation, API,...). • Responsable de l'annuaire de prestataires logiciellibre.com. • Assistant à la Faculté Polytechnique de l'Université de Mons (www.umons.ac.be). • Conseiller technologique au CETIC (www.cetic.be). 2
  • 3. Qu'est-ce que le CETIC ? • Centre d'Excellence en Technologies de l'Information et de la Communication basé à Charleroi (Belgique). • Trois départements (et types de services) : • Software & System Engineering : qualité logicielle (fiabilité, sécurité, respect des normes internationales, processus,...). • Software & Services Technologies : architectures orientées services et sémantique. • Embedded & Communication Systems : prototypage de systèmes embarqués communicants et nouvelles technologies électroniques. 3
  • 5. De quoi allons-nous parler ? • Sujet : création d'un moteur de recherche utilisant les technologies « wget » et « Zend Search » (version PHP de Lucene). • Plan : • Présentation des outils (wget, Lucene, Zend Search). • Mise en œuvre (encodage UTF-8 sous PHP, Zend Search en pratique,...). • Quelques exemples. • Conclusion. 5
  • 6. Outils 6
  • 7. Wget (1) • Utilitaire GNU en ligne de commande, compatible Linux ou Cygwin, permettant de récupérer des fichiers en utilisant HTTP, HTTPS et FTP. • Commande de base : • wget www.cetic.be • Stocke localement la page située à l'adresse « www.cetic.be ». • Commande pour un crawl : • wget -r -l2 -P www -R jpg,gif,png 'http://www.cetic.be' • Crawl récursif de profondeur 2 pour le site « http://www.cetic.be » et résultats du crawl dans le répertoire « www » (+ rejet des photos). 7
  • 8. Wget (2) • Multiples options : • -r (crawl récursif) • Par défaut : respect de la convention « norobots » • -l (profondeur de récursion) • -P (répertoire cible pour le stockage) • -A et -R (filtrage des URLs par pattern) • --user-agent (« user agent » imposé) • ... • Plus d'infos : http://www.gnu.org/software/wget/manual/ . • Alternative : curl (puissant mais... pas de crawl récursif). 8
  • 9. Lucene (1) • Outil d'indexation supporté par la fondation Apache (lucene.apache.org). • Ecosystème étendu : • Utilisé dans Alfresco, Jahia, Liferay,... • Extension au cloud (ex. : CouchDB-lucene). • Beaucoup d'outils tiers : Luke (lecture d'un index), Solr (serveur de recherche ; sans crawler), Nutch (moteur de recherche avec crawler), Carrot2 (interface de recherche compatible OpenSearch et Solr),... • Cf. http://wiki.apache.org/lucene-java/PoweredBy . 9
  • 10. Lucene (2) • Le format d'index est devenu une sorte de standard. • Nombreux portages : Lucene.Net (. Net), PyLucene (Python), CLucene (C++) Plucene (Perl), Zend Search (PHP),... • Différents types de portages : par traduction littérale (compatibilité d'API d'abord), par traduction optimisée pour le langage cible (performances d'abord) et par binding (Python). • Points à surveiller : couverture fonctionnelle, version de l'index,... 10
  • 11. Zend Search (1) • Portage de Lucene en PHP. • API spécifique. • Support de la version d'index 2.3 (depuis Zend Framework 1.6). • Support de l'UTF-8 en interne. • Intégré au framework Zend mais utilisable séparément (taille sur disque : 734,3 ko). • Taille d'index théorique maximum = 2GB (système 32 bits). • Facilement hébergeable (installable sur un hébergement mutualisé type OVH ou Lost Oasis). 11
  • 12. Zend Search (2) • Plusieurs types de champs supportés : « Keyword », « UnIndexed », « Binary », « Text » et « UnStored ». 12
  • 13. Zend Search (3) • Syntaxe supportée lors des recherches : • Opérateurs booléens (« OR » ou « || », « AND » ou « && », « NOT » ou «  ! », « + », « - »), • indicateur de champs (« title: »), • jokers (« ? » ou « * »), • recherche par intervalle (dates ou chaines), • recherche floue (« ~ »), • recherches de proximité (« ~ »), • facteur de boost (« ^ »). • Possibilité de trier par champs. • Cf. http://framework.zend.com/manual/fr/zend.search.lucene.searching.html et http://framework.zend.com/manual/fr/zend.search.lucene.query-language.html . 13
  • 14. Zend Search (4) • Possibilité de personnaliser l'analyse des documents : • Utilisation d'un analyseur par défaut (Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive). • Possibilité de choisir un analyseur (compatible UTF-8, compatible avec les nombres,...). • Possibilité de configurer des filtres (« lowercase », « stop words », « short words »). • Possibilité de créer son propre analyseur. • Cf. http://framework.zend.com/manual/fr/zend.search.lucene.extending.html . • Possibilité de chargement direct de documents : formats HTML, MS Word / Powerpoint / Excel,... 14
  • 15. Divers • Autres outils utiles (pour un moteur de recherche) : • En CLI : • PDFtoText : conversion d'un document PDF en texte brut. • En PHP : • SimplePie (simplepie.org) : lecteur RSS robuste. • GeoIP PHP API (www.maxmind.com): géolocalisation d'adresses IP (cf. « pure PHP module »). • Dans PEAR : – PEAR Text_LanguageDetect (pear.php.net) : détection de la langue d'une phrase. • Dans Zend : – Zend_Paginator : gestion des pages (collection de données). – Zend_Tag : création d'un nuage de tags. – Zend_Service : passerelles vers plusieurs API populaires (Delicious, Twitter,...). • ... 15
  • 17. Encodage UTF-8 sous PHP (1) • PHP 5 (et <5) travaille en ISO-8859-1. • Problème ? • L'UTF-8 permet de présenter davantage de jeux de caractères que l'ISO 8859-1 mais... • L'UTF-8 stocke les caractères sur 1 ou plusieurs octets (1 seul en ISO- 8859-1). • Donc ? • L'UTF-8 est mieux adapté à l'Internet. • La chaîne d'outils utilisés (éditeur, langage de script, base de données, navigateur,...) doit connaître l'encodage utilisé pour comprendre les chaînes. • Exemple de problème : « Archive — Little I dreamed of being like L©guman ... now I eat carrots ». • Cf. http://openweb.eu.org/articles/jeux_caracteres . 17
  • 18. Encodage UTF-8 sous PHP (2) • Dans PHP : • La logique est différente de celle de Python, qui propose un type « string » et un type « Unicode ». PHP est très faiblement typé et travaille uniquement avec des chaines. • La conversion entre ISO et UTF-8 se fait à l'aide des fonctions « utf8_encode() » et « utf8_decode() ». Les autres conversions se font via « iconv ». • La manipulation des chaines en UTF-8 se fait à l'aide de la bibliothèque « mbstring ». • La détermination de l'encodage des caractères en entrée n'est pas triviale (headers HTTP parfois erronés, métadonnées HTML parfois absentes ou erronées, outils de détection pas toujours fiables,...). 18
  • 19. Zend Search (1) • Création d'un index et insertion : $index = Zend_Search_Lucene::create('/data/my-index'); $doc = new Zend_Search_Lucene_Document(); $doc->addField(Zend_Search_Lucene_Field::Text('title', $docTitle)); $doc->addField(Zend_Search_Lucene_Field::UnIndexed('url', $docUrl)); $doc->addField(Zend_Search_Lucene_Field::UnStored('content', $docContent)); $index->addDocument($doc); $index->commit() ; • Optimisation de l'index : $index->optimize(); 19
  • 20. Zend Search (2) • Ouverture d'un index et recherche : $index = Zend_Search_Lucene::open('/data/my-index') ; $query = Zend_Search_Lucene_Search_QueryParser::parse($input); $hits = $index->find($query); foreach ($hits as $hit) { echo $hit->score; echo $hit->title; echo $hit->url; } • Paramètres : opérateur par défaut, encodage des données,... 20
  • 21. Divers • Attention : wget affecte conventionnellement le nom « index.html » à l'adresse « / ». • Analyse des documents HTML : • native (cf. « Zend_Search_Lucene_Document_Html »), • manuelle non structurée (extraction des métadonnées -title, description,...- par expressions régulières et nettoyage du <body> via « strip_tags ») ou... • manuelle structurée (extraction structurée par expression régulière ou Xpath). • Lucene ne gère pas les contraintes d'intégrité. • Les doublons ne peuvent donc pas être évités via un champ « UNIQUE ». • Or, hash utile sur l'URL, voire sur le contenu (duplicate content). • Solutions possibles : test sur un champ unique dans l'index ou test sur base d'une table externe (ex. : hash dans SQLite). 21
  • 22. Exemple : indexation de flux RSS • Indexation de flux RSS (retronimo.com). • Collecte des URLs des flux RSS et Atom via un crawler multithread Python. • Lecture, indexation et interface de recherche en PHP. • Lecture des flux RSS avec SimplePie, localisation du serveur avec GeoIP et détection de la langue sur base de liste de « stop words ». 22
  • 24. Exemple : pages HTML (2) • Étape 1 : constituer une base de données d'URLs (basé sur logiciellibre.com). • Étape 2 : • Détecter les éventuelles redirections, sites morts, etc (automatisable sous PHP avec « get_headers »). • Générer les requêtes wget correspondantes. • Lancer le crawl avec « wget ». • Étape 3 : lancer l'indexation des pages collectées par « wget ». • Utilité : identifier les prestataires actifs sur une ou plusieurs technologies particulières (cf. thème « Entreprises »). 24
  • 25. Exemple : pages HTML (3) • Performances : Active index: index-fr: Create index: From 30-06-2011 13:39:16 to 30-06-2011 13:44:28. Size of the index: 4299 document(s) and 35,5Mo. Time: 258,957s. (60,237ms./doc.). Optimization time: 49,154s. Tests: Search (test): 25 result(s) (max.: 25) in 10,130ms. for 'python'. Search (test): 69 result(s) (max.: 250) in 4,425ms. for 'python'. Search (test): 25 result(s) (max.: 25) in 11,798ms. for 'python AND plone'. Search (test): 27 result(s) (max.: 250) in 7,111ms. for 'python AND NOT plone'. Search (test): 102 result(s) (max.: 250) in 8,569ms. for 'python OR plone^4'. 25
  • 27. Conclusion (1) • Grande facilité d'intégration dans un programme PHP. Supporté sur la plupart des hébergements LAMP, même mutualisés. • Réponses pertinentes. Grande richesse du langage d'interrogation. Interprétation des requêtes. • Possibilité de choisir et de personnaliser les analyseurs de texte. • Fonctionnement correct pour des index de taille limitée : • Fragilité de l'index lors d'une forte sollicitation en insertion (requêtes simultanées) depuis une application Web (risque d'index corrompu à partir de 5000 documents environ) mais... • Problème constaté sous Windows XP et pas sous Ubuntu (?). 27
  • 28. Conclusion (2) • Deux tests réalisés : • Insertions simultanées depuis une application Web (requêtes sur « localhost »). • Index : 12.065 documents (contenus RSS) et 22 Mo. • Insertions séquentielles depuis la ligne de commande (« php monscript.php »). • Index : 15.790 documents (pages HTML) et 167,5 Mo. • Dans ce cas : lancement sur serveur si accès « administrateur » ou synchronisation de l'index depuis un poste local (par exemple via synchronisation FTP, cf. LFTP). 28
  • 29. Merci! Merci pour votre attention. Des questions ? 29
  • 31. Outils • SQLite (www.sqlite.org). • WampServer (www.wampserver.com). • Lucene (lucene.apache.org). • Zend framework (framework.zend.com). • SolR (lucene.apache.org/solr/). • Carrot² (project.carrot2.org). • Luke (www.getopt.org/luke/). • Nutch (nutch.apache.org). • Tesseract (tesseract-ocr.googlecode.com). 31
  • 32. Ressources et liens utiles • Robert Viseur (2010). "Introduction to libre « fulltext » technology". RMLL 2010. URL : http://www.robertviseur.be/news-20100710.php . • Erik Hatcher et Otis Gospodnetić (2004). "Lucene in Action". Manning Publications Co. • Moteur de recherche avec Zend Search Lucene. URL : http://www.libre-a-vous.fr/moteur-recherche-zend- search-lucene/ . • GNU Wget. URL: http://www.gnu.org/software/wget/manual/ . • Introduction aux jeux de caractères. URL: http://openweb.eu.org/articles/jeux_caracteres . 32
  • 33. Contact • Dr Ir Robert Viseur. • Email : robert.viseur@cetic.be • Phone : 0032 (0) 479 66 08 76 Cette présentation est diffusée sous licence « CC-BY ». 33