Table des matières Utilisation de Lucene... 2 Classes d'indexation... 2 IndexWriter... 2 Directory... 2 Analyzer... 2 Document... 2 Field... 2 Classes de recherche... 3 IndexSearcher... 3 Query... 3 QueryParser... 3 TopDocs... 3 Vocabulaire... 3 Exemple de création d un index... 4 Exemple de recherche... 4 Utilisation de Solr... 5 Installation avec Tomcat... 5 Les fichiers de configuration... 5 solrconfig.xml... 5 schema.xml... 6 Exemple de création d indexation avec Solr... 6 Exemple de recherche avec Solr... 7
Utilisation de Lucene Classes d'indexation IndexWriter - La classe IndexWriter est le composant central du processus d'indexation. Cette classe crée un nouvel index et ajoute des documents à un index existant. On peut se la représenter comme un objet par lequel on peut écrire dans l'index mais qui ne permet pas de le lire ou de le rechercher. Directory - La classe Directory représente l'emplacement de l'index de Lucene. IndexWriter utilise une des implémentations de Directory, FSDirectory, pour créer son index dans un répertoire dans le Système de fichiers. Une autre implémentation, RAMDirectory, prend toutes ses données en mémoire. Cela peut être utile pour de plus petits indices qui peuvent être pleinement chargés en mémoire et peuvent être détruits sur la fin d'une application. Analyzer - Avant que le texte soit dans l'index, il passe par l'analyser. Celui-ci est une classe abstraite qui est utilisée pour extraire les mots importants pour l'index et supprime le reste. Cette classe tient une part importante dans Lucene et peut être utilisée pour faire bien plus qu'un simple filtre d'entrée. Document - La classe Document représente un rassemblement de champs. Les champs d'un document représentent le document ou les métadonnées associées avec ce document. La source originelle (comme des enregistrements d'une base de données, un document Word, un chapitre d'un livre, etc.) est hors de propos pour Lucene. Les métadonnées comme l'auteur, le titre, le sujet, la date, etc. sont indexées et stockées séparément comme des champs d'un document. Field - Chaque document est un index contenant un ou plusieurs champs, inséré dans une classe intitulé Field. Chaque champ (field) correspond à une portion de donnée qui est interrogé ou récupéré depuis l'index durant la recherche. 2
Classes de recherche IndexSearcher - La classe IndexSearcher est à la recherche ce que IndexWriter est à l'indexation. On peut se la représenter comme une classe qui ouvre un index en mode lecture seule. Query - La classe Query est une classe abstraite qui comprend BooleanQuery, PhraseQuery, PrefixQuery, PhrasePrefixQuery, RangeQuery, FilteredQuery, et SpanQuery. QueryParser - La classe QueryParser est utilisée pour générer un décompositeur analytique qui peut chercher à travers un index. TopDocs - La classe TopDocs est un simple conteneur d'index pour classer les résultats de recherche de documents qui apparaissent pour une interrogation donnée. Pour des raisons de performances, les exemples de classement ne chargent pas depuis l'index tous les documents pour une requête donnée, mais seulement une partie d'entre eux. Vocabulaire Un index Lucene est une collection de documents Un Document est une collection de Fields Un Field contient le contenu et les metadata 3
Exemple de création d un index public class HelloLucene { //dossier ou l'index sera construit static final File indexdir = new File("helloLuceneIndex"); //cette methode permet de construire un index public static void buildindex() throws IOException { Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30) IndexWriter indexwriter = new IndexWriter(FSDirectory.open(indexDir), analyzer, IndexWriter.MaxFieldLength.LIMITED); String[] texts = new String[] { "hello world", "hello sailor", "goodnight moon" ; for (String text : texts) { Document doc = new Document(); doc.add(new Field("text",text,Field.Store.YES,Field.Index.ANALYZED)); indexwriter.adddocument(doc); indexwriter.close(); public static void main(string[] args) throws Exception{ buildindex(); System.out.println("index terminer"); Exemple de recherche public class HelloLucene { public static void searchindex(string[] querystrings, File indexdir) throws IOException, ParseException { Searcher searcher = new IndexSearcher(FSDirectory.open(indexDir)); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30) ; QueryParser parser = new QueryParser(Version.LUCENE_30,"text",analyzer); for (String querystring : querystrings) { System.out.println("\nsearching for: " + querystring); Query query = parser.parse(querystring); TopDocs results = searcher.search(query,10); System.out.println("total hits: " + results.totalhits); ScoreDoc[] hits = results.scoredocs; for (ScoreDoc hit : hits) { Document doc = searcher.doc(hit.doc); System.out.printf("%5.3f %s\n", hit.score, doc.get("text")); searcher.close(); public static void main(string[] args) throws Exception{ buildindex(); System.out.println("built index"); searchindex(args); System.out.println("\nall done"); 4
Utilisation de Solr Installation avec Tomcat 1. Afin de pouvoir passer en mode HTTP-GET des critères de recherche utilisant des caractères internationaux (code supérieur à 127) il est nécessaire d éditer le fichier conf/server.xml de Tomcat et d ajouter l attribut suivant à l élément Connector approprié : URIEncoding=»UTF-8. Il s agit du connecteur correspondant au port 8080 : <Connector port="8080" maxhttpheadersize="8192" maxthreads="150" minsparethreads="25" maxsparethreads="75" enablelookups="false" redirectport="8443" acceptcount="100" connectiontimeout="20000" disableuploadtimeout="true" URIEncoding="UTF-8" /> 2. Copier le fichier «d:\solr\apache-solr\example\webapps\solr.war» dans le répertoire webapps de Tomcat. 3. Au moyen de la console Tomcat (dans le system tray), ajouter le paramètre -Dsolr.solr.home=d:\solr\apache-solr\example\solr 4. Redémarrer Tomcat. Administration: http://localhost:8080/solr/admin Recherche : http://localhost:8080/solr/admin/form.jsp Les fichiers de configuration Les fichiers de configuration sont localisés dans le répertoire «/conf». Il s agit principalement de solrconfig.xml et schema.xml. solrconfig.xml Il s agit du fichier qui contient l essentiel des paramètres liés au fonctionnement de Solr et plus particulièrement des paramètres de l API Lucene qu utilise Solr (longueur maximale d une champs, taille des buffer mémoire, fréquence de commit, ). Lien pour la doc (http://wiki.apache.org/solr/solrconfigxml) 5
schema.xml Il s agit du fichier qui décrit comment seront indexées les données dans Solr. Il définit les types de données, les champs, les manipulations sur les données lors de l indexation, les champs obligatoires, le champ de requête par défaut, Lien pour la doc (http://wiki.apache.org/solr/schemaxml) Exemple de création d indexation avec Solr import java.io.ioexception; import java.net.malformedurlexception; import java.util.arraylist; import java.util.collection; import org.apache.solr.client.solrj.solrserver; import org.apache.solr.client.solrj.solrserverexception; import org.apache.solr.client.solrj.impl.commonshttpsolrserver; import org.apache.solr.common.solrinputdocument; public class IndexTest { /** * @param args * @throws MalformedURLException */ public static void main(string[] args) { CommonsHttpSolrServer server = null; try{ server = new CommonsHttpSolrServer("http://localhost:8080/solr"); catch(exception e){ System.out.println("err1"); //Creation d'un document Solr SolrInputDocument doc = new SolrInputDocument(); //ajout de contenu dans le document doc.addfield( "id", "id12", 1.0f ); doc.addfield( "name", "doc1", 1.0f ); doc.addfield( "features", "Le principe de Solr est de fonctionner grâce aux API XML/HTTP", 1.0f ); doc.addfield( "price", 10 ); //Collection de Document (permet d'ajouter plusieur document a la fois) Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); docs.add(doc); //indexe les données dans le serveur try { server.add(docs); server.commit(); System.out.println("Les données sont indexés"); catch (SolrServerException e) { // TODO Auto-generated catch block catch (IOException e) { // TODO Auto-generated catch block 6
Exemple de recherche avec Solr package test; import org.apache.solr.common.solrdocumentlist; import org.apache.solr.common.solrdocument; import org.apache.solr.client.solrj.solrserverexception; import org.apache.solr.client.solrj.solrquery; import org.apache.solr.client.solrj.impl.commonshttpsolrserver; import org.apache.solr.client.solrj.response.queryresponse; class SolrjTest { public void query(string q) { CommonsHttpSolrServer server = null; try{ server = new CommonsHttpSolrServer("http://localhost:8080/solr/"); catch(exception e){ //initialisation de l'objet SolrQuery SolrQuery query = new SolrQuery(); query.setquery(q); try{ //envoie de la requete //la requete renvoie un objet de type QueryResponse QueryResponse qr = server.query(query); //On recupére la SolrDocumentList qui est une liste contenant les metadonnées de chaque resultat trouvé SolrDocumentList sdl = qr.getresults(); //On affiche le nombre de resultat trouvé System.out.println("NbReponse: " + sdl.getnumfound()); System.out.println("--------------------------------"); //On affiche les Résultats for(solrdocument d : sdl){ System.out.println(d.get("name") + " (" + d.get("features") + ")"); catch (SolrServerException e){ public static void main(string[] args){ SolrjTest solrj = new SolrjTest(); solrj.query("doc1"); 7