<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Wiizio &#187; Lucene</title>
	<atom:link href="http://www.wiizio.com/tag/lucene/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wiizio.com</link>
	<description>Solutions de recherche d&#039;entreprise open-source</description>
	<lastBuildDate>Thu, 06 Jan 2011 17:21:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Obtenir une compilation nocturne de Lucene 4.0 et Solr 4.0</title>
		<link>http://www.wiizio.com/2010/11/03/obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0/</link>
		<comments>http://www.wiizio.com/2010/11/03/obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 18:15:09 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Technique]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[nightly build]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=328</guid>
		<description><![CDATA[<p>Depuis le début de l&#8217;année les sources de Lucene et Solr ont fusionnées.  La prochaine version commune aura pour numéro 4.0. Pour ceux qui  veulent déjà tester la version en cours de développement, il faut en  récupérer les sources et les compiler. En effet, les liens de  téléchargement des compilations nocturnes <p>Lire la suite <a href="http://www.wiizio.com/2010/11/03/obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0/">Obtenir une compilation nocturne de Lucene 4.0 et Solr 4.0</a></p>]]></description>
			<content:encoded><![CDATA[<p>Depuis le début de l&#8217;année les sources de Lucene et Solr ont fusionnées.  La prochaine version commune aura pour numéro 4.0. Pour ceux qui  veulent déjà tester la version en cours de développement, il faut en  récupérer les sources et les compiler. En effet, les liens de  téléchargement des compilations nocturnes ne fonctionnent pas. En  prérequis, il faut disposer de <strong>svn</strong> client et de <strong>ant</strong>.<span id="more-328"></span></p>
<p>Sur <a href="https://hudson.apache.org/hudson/job/Solr-trunk/" target="_blank">cette page</a>, il est possible de voir le statut de la dernière compilation nocturne. Si ce statut indique une compilation réussie, la procédure pour obtenir et compiler les sources est la suivante :</p>
<p>Créer un répertoire de travail :</p>
<pre>mkdir ~/solr-4.0
</pre>
<p>Se placer dans ce répertoire et récupérer les sources :</p>
<pre>cd ~/solr-4.0
svn checkout http://svn.apache.org/repos/asf/lucene/dev/trunk
</pre>
<p>Compiler les sources :</p>
<pre>cd ~/solr-4.0/modules
ant compile
cd ~/solr-4.0/lucene
ant dist
cd ~/solr-4.0/modules
ant dist</pre>
<p>Le tour est joué !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2010/11/03/obtenir-une-compilation-nocturne-de-lucene-4-0-et-solr-4-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrader Lucene dans Solr 1.4</title>
		<link>http://www.wiizio.com/2010/10/31/upgrader-lucene-dans-solr-1-4/</link>
		<comments>http://www.wiizio.com/2010/10/31/upgrader-lucene-dans-solr-1-4/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 18:10:44 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Technique]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=311</guid>
		<description><![CDATA[<p>Solr 1.4 utilise Lucene 2.9.0 et depuis sa sortie en novembre 2009, des mises à jours de Lucene sont disponibles. La dernière version de ce dernier est la 2.9.3. Afin de bénéficier de ces mises à jours dans Solr, il est possible de patcher le fichier solr.war. Les étapes pour réaliser ceci sont :</p>
<p>* créer <p>Lire la suite <a href="http://www.wiizio.com/2010/10/31/upgrader-lucene-dans-solr-1-4/">Upgrader Lucene dans Solr 1.4</a></p>]]></description>
			<content:encoded><![CDATA[<p>Solr 1.4 utilise Lucene 2.9.0 et depuis sa sortie en novembre 2009, des mises à jours de Lucene sont disponibles. La dernière version de ce dernier est la 2.9.3. Afin de bénéficier de ces mises à jours dans Solr, il est possible de patcher le fichier solr.war. <span id="more-311"></span>Les étapes pour réaliser ceci sont :</p>
<p>* créer un répertoire de travail</p>
<pre style="padding-left: 30px;">mkdir /tmp/solr</pre>
<p>* copier solr.war dans /tmp/solr</p>
<p>* extraire le contenu de solr.war et effacer solr.war</p>
<pre style="padding-left: 30px;">cd /tmp/solr
jar -xvf solr.war
rm solr.war</pre>
<p>* remplacer dans /tmp/solr/WEB-INF/lib tous les fichiers lucene-&#8230;-2.9.0.jar par leurs équivalents en version 2.9.3.</p>
<p>* astuce pour les utilisateurs de mac os, il faut supprimer les fichiers cachés &laquo;&nbsp;.DS_Store&nbsp;&raquo; qui ont été créés dans chaque répertoire</p>
<pre style="padding-left: 30px;">find . -name .DS* -print -exec rm -rf {} \;</pre>
<p>* reconstruire solr.war</p>
<pre style="padding-left: 30px;">jar cvf solr.war .</pre>
<p>Pour consulter la liste des évolutions et corrections depuis Lucene 2.9.0, vous pouvez consulter le &laquo;&nbsp;<a href="http://lucene.apache.org/java/2_9_2/changes/Changes.html" target="_blank">Lucene Change Log</a>&laquo;&nbsp;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2010/10/31/upgrader-lucene-dans-solr-1-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recherche open source: Lucene fait son show</title>
		<link>http://www.wiizio.com/2010/04/26/recherche-open-source-lucene-fait-son-show/</link>
		<comments>http://www.wiizio.com/2010/04/26/recherche-open-source-lucene-fait-son-show/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 16:07:09 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Actualité Moteur de Recherche Open Source]]></category>
		<category><![CDATA[logiciel_libre]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[moteur_de_recherche]]></category>
		<category><![CDATA[open_source]]></category>
		<category><![CDATA[search_engine]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=309</guid>
		<description><![CDATA[<p>Apache Lucene et Apache Solr, deux solutions open source d’indexation et de recherche des données, seront au cœur de l’Apache Lucene EuroCon 2010.</p>
<p>A lire ici</p>
]]></description>
			<content:encoded><![CDATA[<p>Apache Lucene et Apache Solr, deux solutions open source d’indexation et de recherche des données, seront au cœur de l’Apache Lucene EuroCon 2010.</p>
<p><a href="http://www.silicon.fr/fr/news/2010/04/26/la_solution_de_recherche_open_source_lucene_fait_son_show" target="_blank">A lire ici</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2010/04/26/recherche-open-source-lucene-fait-son-show/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sematext met en oeuvre Lucene Solr</title>
		<link>http://www.wiizio.com/2010/01/14/sematext-met-en-oeuvre-lucene-solr/</link>
		<comments>http://www.wiizio.com/2010/01/14/sematext-met-en-oeuvre-lucene-solr/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 10:49:40 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Actualité Moteur de Recherche Open Source]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[moteur_de_recherche]]></category>
		<category><![CDATA[open_source]]></category>
		<category><![CDATA[search_engine]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=298</guid>
		<description><![CDATA[<p>http://sematext.com/</p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://sematext.com/">http://sematext.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2010/01/14/sematext-met-en-oeuvre-lucene-solr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lucene / Solr &#8211; Open Source Search Engine Features</title>
		<link>http://www.wiizio.com/2009/11/23/lucene-solr-open-source-search-engine-features/</link>
		<comments>http://www.wiizio.com/2009/11/23/lucene-solr-open-source-search-engine-features/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 08:20:09 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Actualité Moteur de Recherche Open Source]]></category>
		<category><![CDATA[logiciel_libre]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[moteur_de_recherche]]></category>
		<category><![CDATA[open_source]]></category>
		<category><![CDATA[search_engine]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=290</guid>
		<description><![CDATA[<p>Lucene and Solr can be considered as an open backbone for users who have the freedom to plug-in the best tool for their work.</p>
<p>A lire sur  ARTICLE GALLERY</p>
]]></description>
			<content:encoded><![CDATA[<p>Lucene and Solr can be considered as an open backbone for users who have the freedom to plug-in the best tool for their work.</p>
<p>A lire sur  <a title="Open Source Search Engine Features" href="http://www.articlegallery.net/Art/289914/397/Lucene-Solr-Open-Source-Search-Engine-Features.html">ARTICLE GALLERY</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2009/11/23/lucene-solr-open-source-search-engine-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une interview de Erik Hatcher un contributeur majeur de Lucene et Solr</title>
		<link>http://www.wiizio.com/2009/10/25/une-interview-de-erik-hatcher-un-developpeur-de-lucene-et-solr/</link>
		<comments>http://www.wiizio.com/2009/10/25/une-interview-de-erik-hatcher-un-developpeur-de-lucene-et-solr/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 22:41:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Actualité Open Source]]></category>
		<category><![CDATA[Hatcher]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=277</guid>
		<description><![CDATA[<p>Parue sur The Bitesource</p>
<p>Erik Hatcher est un développeur de logiciels open-source. Avant Lucene et Solr, il a participé à de nombreux projets comme Ant, Tapestry et plusieurs sous-projet Jakarta.</p>
<p>Lisez son interview sur The Bitsource</p>
]]></description>
			<content:encoded><![CDATA[<p>Parue sur <a href="http://www.thebitsource.com/" target="_blank">The Bitesource</a></p>
<p>Erik Hatcher est un développeur de logiciels open-source. Avant Lucene et Solr, il a participé à de nombreux projets comme Ant, Tapestry et plusieurs sous-projet Jakarta.</p>
<p>Lisez son interview sur <a href="http://www.thebitsource.com/2009/10/18/erik-hatcher-on-apache-lucene-and-solr-search-applications/" target="_blank">The Bitsource</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2009/10/25/une-interview-de-erik-hatcher-un-developpeur-de-lucene-et-solr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;open source dans sa logique mutualiste, un vecteur de compétitivité</title>
		<link>http://www.wiizio.com/2009/10/23/lopen-source-dans-sa-logique-mutualiste-un-vecteur-de-competitivite/</link>
		<comments>http://www.wiizio.com/2009/10/23/lopen-source-dans-sa-logique-mutualiste-un-vecteur-de-competitivite/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 15:03:58 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Actualité Open Source]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[logiciel_libre]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[moteur_de_recherche]]></category>
		<category><![CDATA[search_engine]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=275</guid>
		<description><![CDATA[
par Patrice BERTRAND, Directeur Général de Smile

<p></p>

<p>Lorsqu&#8217;on parle des business models de l&#8217;open source, on pense le plus souvent à ses acteurs économiques, éditeurs de logiciel, intégrateurs, distributeurs, prestataires de support, tous entreprises à but lucratif si l&#8217;on peut dire.</p>


La suite sur Progilibre.com
]]></description>
			<content:encoded><![CDATA[<div>
<div>par Patrice BERTRAND, Directeur Général de Smile</div>
</div>
<p><br class="spacer_" /></p>
<div>
<p>Lorsqu&#8217;on parle des business models de l&#8217;open source, on pense le plus souvent à ses acteurs économiques, éditeurs de logiciel, intégrateurs, distributeurs, prestataires de support, tous entreprises à but lucratif si l&#8217;on peut dire.</p>
</div>
<div></div>
<div>La suite sur <a href="http://www.progilibre.com/L-open-source-dans-sa-logique-mutualiste,-un-vecteur-de-competitivite_a965.html">Progilibre.com</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2009/10/23/lopen-source-dans-sa-logique-mutualiste-un-vecteur-de-competitivite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer un nuage de tags avec Lucene</title>
		<link>http://www.wiizio.com/2009/10/01/creer-un-nuage-de-tags-avec-lucene/</link>
		<comments>http://www.wiizio.com/2009/10/01/creer-un-nuage-de-tags-avec-lucene/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 19:57:04 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Technique]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[nuage de tags]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=88</guid>
		<description><![CDATA[<p></p>
<p>Dans cet article, je présente une solution afin de générer un nuage de tags (ou nuage de mots clefs) à partir d’un flux de données textuelles. Pour l’exemple, il s’agit de titres d’articles stockés dans un fichier texte.</p>
<p>Le but est d’afficher les mots ou expressions de 2 ou 3 termes les plus fréquents dans les <p>Lire la suite <a href="http://www.wiizio.com/2009/10/01/creer-un-nuage-de-tags-avec-lucene/">Créer un nuage de tags avec Lucene</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/tagcloud.jpg"><img class="alignleft size-medium wp-image-44" src="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/tagcloud.jpg" alt="" width="90" height="90" /></a></p>
<p>Dans cet article, je présente une solution afin de générer un <a href="http://fr.wikipedia.org/wiki/Nuage_de_mots_clefs" target="_blank">nuage de tags</a> (ou nuage de mots clefs) à partir d’un flux de données textuelles. Pour l’exemple, il s’agit de titres d’articles stockés dans un fichier texte.</p>
<p>Le but est d’afficher les mots ou expressions de 2 ou 3 termes les plus fréquents dans les titres. Tous les termes ou expressions ne sont pas à conserver dans le nuage de tag. Une des étapes consiste en un filtrage selon des règles définies dans fichiers de règles : suppression des mots vides (je, le, pour, …), suppression des expressions commençant ou se terminant par un mot vide (”ne mange”, “termes les”, …), suppression des nombres, …<span id="more-88"></span></p>
<p>Les étapes nécessaires à la mise en œuvre de cette solution sont :</p>
<ul>
<li>Etape 1 : indexation des titres dans Lucene</li>
<li>Etape 2 : extraction des termes ou expressions de l’index</li>
<li>Etape 3 : filtrage des termes ou expressions</li>
<li>Etape 4 : affichage du nuage en PHP</li>
</ul>
<p>Les 3 premières étapes sont réalisées en java avec Lucene et donne comme résultat un fichier de termes ou expressions retenues dans le nuage de tags avec leur fréquence d’apparition.</p>
<p>La 4ème étape est réalisée en PHP et exploite le fichier résultat des étapes précédentes afin de mettre en forme le nuage de tags.</p>
<h3>Pourquoi utiliser Lucene (étapes 1 et 2) ?</h3>
<p>La génération du nuage de tags nécessite 2 étapes que Lucene est à même de réaliser : analyser et découper le texte servant à générer le nuage de tags et indiquer la fréquence d’apparition de chaque mot ou expression.</p>
<p>Lucene utilise des analyzers afin d’indexer le texte. Ces analyzers ont pour rôle principal de découper le texte en « token ». Selon les analyzers utilisés les tokens sont séparés par des espaces, des ponctuations, des caractères spéciaux (#, @, …), des chiffres, …</p>
<p>Par exemple, pour la phrase suivante : « Parcours du Tour de France », les tokens seraient sans doute : « parcours », « du », « tour », « de » et « France ».</p>
<p>Dans notre nuage de tags, nous ne voulons pas uniquement des mots simples, mais également des expressions de 2 ou 3 mots. Il nous faut donc extraire toutes les combinaisons possibles de tokens de 1, 2 ou 3 mots, c&#8217;est-à-dire : « parcours », « du », « tour », « de », « France », « parcours du », « du tour », « tour de », « de France », « parcours du tour », « du tour de » et « tour de France »</p>
<p>Un analyzer permettant de faire cela est disponible non pas dans la distribution standard de Lucene, mais à l’adresse suivante : <a href="http://issues.apache.org/jira/browse/LUCENE-400" target="_blank">http://issues.apache.org/jira/browse/LUCENE-400</a>. Inutile de récupérer cet analyzer, j’en fournie les sources modifiés afin de fonctionner avec Lucene 2.3.2</p>
<p>Pour une présentation plus complète de Lucene, voir mon article &laquo;&nbsp;<a href="http://www.zoonix.fr/2008/08/06/introduction-a-lucene/">Introduction à Lucene</a>&laquo;&nbsp;.</p>
<h3>Pourquoi filtrer les termes ou expressions (étape 3) ?</h3>
<p>Dans l’exemple indiqué ci-dessus, les termes ou expressions obtenues sont : « parcours », « du », « tour », « de », « France », « parcours du », « du tour », « tour de », « de France », « parcours du tour », « du tour de » et « tour de France ». On remarque immédiatement des éléments que l’on ne souhaite pas voir apparaître dans le nuage : « du », « de », « parcours du », « du tour », « tour de », « de France » et « du tour de ». Il s&#8217;agit des mots-vides ou expression commençant ou se terminant par un mot-vide. Il reste donc les éléments suivants : « parcours », « France », « parcours du tour » et « tour de France ».</p>
<p>Nous pousserons le nettoyage jusqu&#8217;à supprimer les mots simples ou expressions apparaissants déjà dans une expression constituée de plus de mots. En effet, imaginons des données à analyser contenant une ou plusieurs fois les expressions suivantes : « tour de France », « tour d’Italie » et « tour d’Espagne », mais jamais ou peu de fois les mots « tour », « France », « Italie » et « Espagne » hors de ces expressions. Sans ce nettoyage, le nuage de tags contiendrait certainement « tour », « Italie », « France » et « Espagne » (très fréquents) et sans doute mais sans certitude « tour de France », « tour d’Italie » et « tour d’Espagne » (moins fréquents). Le nuage de tags serait alors complètement faux.</p>
<p>Ainsi nettoyé, le nuage devient « parcours du tour » et « tour de France » et est beaucoup plus pertinent que ce que nous avions obtenu avant le filtrage.</p>
<p>L’algorithme de nettoyage utilisant un fichier de règles est adapté de l’algorithme décrit dans l’article &laquo;&nbsp;<a href="http://richardfriedman.blogspot.com/2007/07/lucene-tag-cloud-generator.html" target="_blank">Lucene Tag Cloud Generator</a>&nbsp;&raquo; de <a href="http://richardfriedman.blogspot.com/" target="_blank">Richard Friedman</a>.</p>
<p>Le fichier de règles est principalement constituer de la liste des mots vides mais commence par 5 paramètres pouvant être désactivés (en mettant les lignes en commentaires avec un #). Il s’agit de :</p>
<ul>
<li>-smallwords : pour retirer les mots de 3 caractères ou moins</li>
<li>-numbers : pour retirer les nombres</li>
<li>-dashes : pour retirer les mots contenant un tiret (« &#8211; »)</li>
<li>-period : pour retirer les mots contenant un point</li>
<li>-include : pour retirer les mots ou expressions incluent dans une autre expression. J’ai mis cette option pour le principe, mais en la désactivant les résultats sont généralement très décevants.</li>
</ul>
<h3>Code source des étapes 1, 2 et 3</h3>
<p>Le code source java est disponible <a href="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/tagscloud.zip">ici</a> sous forme d’un projet <a href="http://www.eclipse.org/downloads/moreinfo/jee.php" target="_blank">Eclipse</a>. Il contient les fichiers suivants :</p>
<ul>
<li>NGramAnalyzerWrapper.java et NGramFilter.java (analyzer Lucene)</li>
<li>TagCloud.java (classe principale avec l’algorithme de filtrage)</li>
<li>input.txt (les données exemples à analyser)</li>
<li>rules.txt (le fichier de règles)</li>
</ul>
<p>Pour lancer l&#8217;analyse d&#8217;un fichier de données, l’usage est le suivant :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Usage<span style="color: #339933;">:</span> org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">demo</span>.<span style="color: #006633;">TagCloud</span> <span style="color: #339933;">-</span>input <span style="color: #009900;">&#91;</span>inputfile<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span>output <span style="color: #009900;">&#91;</span>outputfile<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span>rules <span style="color: #009900;">&#91;</span>rulesfile<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span>count <span style="color: #009900;">&#91;</span>count<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span>boost <span style="color: #009900;">&#91;</span>boost<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span>minfreq <span style="color: #009900;">&#91;</span>minfreq<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span>maxterm <span style="color: #009900;">&#91;</span>maxterm<span style="color: #009900;">&#93;</span>
&nbsp;
    input    <span style="color: #339933;">-</span> input file with data to be clouded
    output   <span style="color: #339933;">-</span> output file with cloud data
    rules    <span style="color: #339933;">-</span> rules file
    count    <span style="color: #339933;">-</span> max number of items within the cloud <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span>
    boost    <span style="color: #339933;">-</span> boost value <span style="color: #000000; font-weight: bold;">for</span> multi<span style="color: #339933;">-</span>terms tags <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
    minfreq  <span style="color: #339933;">-</span> minimum frequence <span style="color: #000000; font-weight: bold;">for</span> a ngram <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span>
    maxterms <span style="color: #339933;">-</span> maximum number of terms in expressions in the cloud <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span>
&nbsp;
Example<span style="color: #339933;">:</span> java org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">demo</span>.<span style="color: #006633;">TagCloud</span> <span style="color: #339933;">-</span>input <span style="color: #339933;">/</span>tmp<span style="color: #339933;">/</span>input.<span style="color: #006633;">txt</span> –output <span style="color: #339933;">/</span>tmp<span style="color: #339933;">/</span>output.<span style="color: #006633;">txt</span> <span style="color: #339933;">-</span>rules <span style="color: #339933;">/</span>tmp<span style="color: #339933;">/</span>rules.<span style="color: #006633;">txt</span> <span style="color: #339933;">-</span>count <span style="color: #cc66cc;">100</span> <span style="color: #339933;">-</span>boost <span style="color: #cc66cc;">1</span> <span style="color: #339933;">-</span>minfreq <span style="color: #cc66cc;">3</span> <span style="color: #339933;">-</span>maxterm <span style="color: #cc66cc;">4</span></pre></div></div>

<h3>Etape 4 : affichage du nuage en PHP</h3>
<p>La mise en forme du nuage de tags utilise le fichier généré par le programme précédent. Une classe PHP réalise cette mise en forme (lecture du fichier et génération du code html) et une feuille de style définie les styles d’affichage.</p>
<p>La classe PHP est une adaptation du code proposé dans l’article &laquo;&nbsp;<a href="http://www.hawkee.com/snippet/1485/" target="_blank">Tagcloud Font Distributor</a>&laquo;&nbsp;.</p>
<p>Le code source disponible <a href="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/tagscloudweb.zip">ici</a> est constitué des fichiers suivants :</p>
<ul>
<li>cloud_tag.inc.php : la classe de génération du nuage de tags en html</li>
<li>tagcloud.css : la feuille de styles pour l&#8217;affichage de nuage de tags</li>
<li>cloud_tag_display.php : un script d&#8217;exemple utilisant la classe et la feuille de styles.</li>
</ul>
<h3>Résultats</h3>
<p>Voici quelques exemples de résultats obtenus à partir du fichier de données exemple et en faisant varier quelques paramètres.</p>
<h4>Exemple 1 : paramètres par défaut</h4>
<p style="text-align: center;"><a href="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/sample1.jpg"><img class="size-medium wp-image-44 aligncenter" src="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/sample1.jpg" alt="" width="462" height="361" /></a></p>
<h4>Exemple 2 : paramètres par défaut sauf boost = 3</h4>
<p>On remarque un plus grand nombre d&#8217;expressions de plus de 1 mot</p>
<p style="text-align: center;"><a href="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/sample2.jpg"><img class="size-medium wp-image-44 aligncenter" src="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/sample2.jpg" alt="" width="462" height="361" /></a></p>
<h4>Exemple 3 : paramètres par défaut sauf maxterm = 5 et boost = 5</h4>
<p>On remarque des expressions jusqu&#8217;à 5 mots et presque plus de mots seuls</p>
<p style="text-align: center;"><a href="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/sample3.jpg"><img class="size-medium wp-image-44 aligncenter" src="http://www.wiizio.com/wp-content/uploads/2009/10/tagcloud/sample3.jpg" alt="" width="462" height="361" /></a></p>
<h3>Stratégies de mise à jour du nuage de tags</h3>
<p>La stratégie de mise à jour du nuage de tags dépend de plusieurs paramètres :</p>
<ul>
<li>type de données (presse, forums, &#8230;)</li>
<li>la fréquence de mise à jour des données (chaque seconde, une fois par heure, une fois par jour, &#8230;)</li>
<li>le dynamisme que l&#8217;on veut donner au nuage</li>
</ul>
<p>Par exemple, pour des données peu changeantes et en faible quantité, on peut choisir de créer le nuage sur les données des 30 derniers jours avec régénération du nuage une fois par jour. Par contre, pour des données très changeantes comme un site de presse avec des données nouvelles toutes les secondes, on peut choisir de générer le nuage sur les données de la dernière journée voir des dernières heures avec régénération du nuage chaque heure voir chaque quart d&#8217;heure.</p>
<h3>Conclusions</h3>
<p>Je pense que des règles de filtrage basées sur des expressions régulières pourraient être ajoutées. Par exemple, une simple règle indiquant de ne pas accepter les mots avec des points ou des tirets remplacerait les règles &laquo;&nbsp;-dashes&nbsp;&raquo; et &laquo;&nbsp;-period&nbsp;&raquo;, une autre remplacerait &laquo;&nbsp;-number&nbsp;&raquo;. On pourrait mettre en place un grand nombre de règles supplémentaires comme par exemple le rejet des dates.</p>
<p>Je suis ouvert à toutes suggestions afin d&#8217;améliorer de la solution proposée.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2009/10/01/creer-un-nuage-de-tags-avec-lucene/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction à Lucene</title>
		<link>http://www.wiizio.com/2009/10/01/introduction-a-lucene/</link>
		<comments>http://www.wiizio.com/2009/10/01/introduction-a-lucene/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 19:55:10 +0000</pubDate>
		<dc:creator>dominique</dc:creator>
				<category><![CDATA[Technique]]></category>
		<category><![CDATA[Lucene]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=78</guid>
		<description><![CDATA[<p>Lucene est une librairie open source en Java (mais il existe de nombreux portages) permettant d&#8217;ajouter des fonctionnalités de recherche plein-texte à vos applications. Le projet Lucene est chapeauté par &#171;&#160;The Apache Software Foundation&#160;&#187;. D&#8217;autres projets très connus et de grande qualité de la fondation sont : Apache HTTP server, Tomcat, Cocoon, Ant, &#8230;</p>
<p>Il s&#8217;agit <p>Lire la suite <a href="http://www.wiizio.com/2009/10/01/introduction-a-lucene/">Introduction à Lucene</a></p>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-160" title="logo_lucene" src="http://www.wiizio.com/wp-content/uploads/2009/10/logo_lucene.jpg" alt="logo_lucene" width="170" height="23" /><a href="http://lucene.apache.org/" target="_blank">Lucene</a> est une librairie open source en Java (mais il existe de nombreux portages) permettant d&#8217;ajouter des fonctionnalités de recherche plein-texte à vos applications. Le projet Lucene est chapeauté par <a href="http://www.apache.org/" target="_blank">&laquo;&nbsp;The Apache Software Foundation&nbsp;&raquo;</a>. D&#8217;autres projets très connus et de grande qualité de la fondation sont : Apache HTTP server, Tomcat, Cocoon, Ant, &#8230;</p>
<p>Il s&#8217;agit bien d&#8217;une librairie avec laquelle il n&#8217;est pas fourni d&#8217;outils permettant l&#8217;indexation de données en quelques clics de souris et quelques paramétrages. Il faut donc en passer par du code Java afin de mettre en place une solution sur mesure de recherche plein-texte.<span id="more-78"></span></p>
<h3>Principe</h3>
<p>Lucene indexe et retrouve des &laquo;&nbsp;documents&nbsp;&raquo;. Par document, on ne parle pas de fichiers Excel, Word, PDF ou HTML, mais d&#8217;une structure de données constituée de champs. Un champ est une donnée possédant un nom (titre, auteur, date de publication, contenu, ..) et à laquelle est associé du texte. C&#8217;est ce texte qui est indexé, recherchable et affichable. Les documents indexés sont regroupés au sein d&#8217;une collection de documents appelée &laquo;&nbsp;index&nbsp;&raquo;. Un index peut contenir plusieurs centaines, milliers ou millions de documents et il est possible de créer autant d&#8217;index différents que le nécessite votre ou vos applications. Physiquement, un index est un répertoire (que vous spécifiez) hébergeant un nombre variable de fichiers (ça c&#8217;est l&#8217;affaire de Lucene).</p>
<p>Si le texte qui est à indexé est contenu dans des fichiers Excel, Word, PDF ou HTML, c&#8217;est de votre ressort d&#8217;en extraire de contenu textuel qui sera indexé. Il est possible d&#8217;utiliser par exemple <a href="http://www.foolabs.com/xpdf/download.html" target="_blank">pdftotext</a> pour les fichiers PDF, <a href="http://www.winfield.demon.nl/" target="_blank">Antiword</a> pour les fichiers Microsoft Word ou tout simplement <a href="http://lucene.apache.org/tika/" target="_blank">la boite à outils Tika</a> qui permet l&#8217;extraction du contenu d&#8217;un grand nombre de format de fichiers.</p>
<h3>Obtenir et utiliser Lucene</h3>
<p>La version actuelle de Lucene est la 2.9 et est disponible <a href="http://www.apache.org/dyn/closer.cgi/lucene/java/" target="_blank">ici</a>. La fichier lucene-x.x.x.zip est suffisant, mais le fichier lucene-x.x.x-src.zip avec les sources devient vite intéressant lorsque l&#8217;on veut étendre les possibilités de lucene et disposer d&#8217;exemples de code.</p>
<p>Dans la suite de cet article nous allons voir un exemple minimaliste illustrant comment indexer et rechercher des données. Cet exemple nous permet d&#8217;introduire les concepts de base de Lucene : document, field, analyzer, query, hits, &#8230;</p>
<p>La première chose à faire afin de pouvoir développer des classes Java utilisant Lucene, c&#8217;est de créer un projet dans votre environnement de développement et d&#8217;y inclure la librairie principale de Lucene : lucene-core-x.x.x.jar. J&#8217;utilise pour ma part <a href="http://www.eclipse.org/downloads/" target="_blank">Eclipse</a>. A noter qu&#8217;un bug dans Sun Java 1.6 a posé problème avec Lucene (<a href="http://www.nabble.com/Bug-in-Sun%27s-1.6-hotspot-compiler-that-can-cause-index-corruption-to18739358.html" target="_blank">détails ici</a>), ce bug a été corrigé à partir de la version 1.6.0_10-rc-b28.</p>
<h3>Un peu de pratique</h3>
<p>L&#8217;exemple qui suit est constitué d&#8217;une unique classe <strong>LuceneIntroduction.java</strong> dont voici le projet <strong>Eclipse</strong> complet dans un <a href="http://www.zoonix.fr/uploads/2008/08/1-Introduction.zip" target="_blank">fichier zip</a>.</p>
<h4>Squelette de la classe</h4>
<p>Le code suivant constitue le squelette de la classe. Il déclare les packages nécessaires et la méthode <strong>main</strong> qui exécute successivement une méthode pour l&#8217;indexation et une méthode pour la recherche.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.analysis.Analyzer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.analysis.standard.StandardAnalyzer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.document.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.index.IndexWriter</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.search.Query</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.search.Hits</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.search.Hit</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.queryParser.QueryParser</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.lucene.search.IndexSearcher</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.File</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.*</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> LuceneIntroduction <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> INDEX_DIR <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;c:<span style="color: #000099; font-weight: bold;">\\</span>temp<span style="color: #000099; font-weight: bold;">\\</span>index_test&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>searchAndDisplay<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;titi&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>searchAndDisplay<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;bla&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h4>Indexer des données</h4>
<p>L&#8217;indexation de données met en oeuvre 4 classes Lucene.</p>
<table style="width: 100%; height: 40px;" border="0" align="left">
<tbody>
<tr valign="top">
<td><strong>IndexWriter</strong></td>
<td>c&#8217;est la classe qui donne accès aux index en écriture (création, ajout de document, optimisation, &#8230;)</td>
</tr>
<tr valign="top">
<td><strong>Analyzer</strong></td>
<td>
<p>il s&#8217;agit d&#8217;un ensemble de classes qui ont pour but le découpage du texte en &laquo;&nbsp;token&nbsp;&raquo; (mot) et la normalisation du texte à indexer. Les principaux analyzer fournis sont :</p>
<table style="width: 100%;" border="0" bgcolor="#eeeeee">
<tbody>
<tr>
<td valign="top">SimpleAnalyzer</td>
<td></td>
<td valign="top">SimpleAnalyzer découpe le texte en mot et le converti en minuscule.</td>
</tr>
<tr>
<td valign="top">StopAnalyzer</td>
<td></td>
<td valign="top">StopAnalyzer découpe le texte en mot, le converti en minuscule et supprime les mots vides (mots sans intérêt dans le processus de recherche : le, la, de &#8230;)</td>
</tr>
<tr>
<td valign="top">StandardAnalyzer</td>
<td></td>
<td valign="top">StandardAnalyzer combine les deux analyzer précédents</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr valign="top">
<td><strong>Document</strong></td>
<td>Un Document représente une unité élémentaire d&#8217;information. Par exemple, indexer tous les fichiers Word d&#8217;un répertoire va ajouter dans l&#8217;index un Document Lucene par fichier. Ce sont des Documents qui sont retournés dans la liste de résultats d&#8217;une recherche. Comme cela a déjà été dit, un document est constitué de champs &laquo;&nbsp;Field&nbsp;&raquo; (nom / valeurs).</td>
</tr>
<tr valign="top">
<td><strong>Field</strong></td>
<td>Il s&#8217;agit d&#8217;un sous élément d&#8217;un document. Les champs les plus fréquents sont : titre, auteur, date de publication, url et bien sur le texte du fichier Word, PDF ou HTML.</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Le code suivant créer un index et ajoute 3 documents dans cet index. La méthode <strong>createDocument </strong>est plus particulièrement dédiée à la création d&#8217;un objet Document Lucene constitué de 3 champs : id, titre et texte.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> index <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #003399;">File</span> dir <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span> <span style="color: #009900;">&#40;</span>INDEX_DIR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>dir.<span style="color: #006633;">exists</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Impossible de créer l'index dans le répertoire '&quot;</span>
                       <span style="color: #339933;">+</span> INDEX_DIR
                       <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;', veuillez le supprimer d'abord.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>	
&nbsp;
  <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Création de l'index</span>
    IndexWriter writer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> IndexWriter<span style="color: #009900;">&#40;</span>INDEX_DIR,
                                         <span style="color: #000000; font-weight: bold;">new</span> StandardAnalyzer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
                                         <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Création et indexation d'un premier document</span>
    <span style="color: #003399;">Document</span> doc <span style="color: #339933;">=</span> createDocument <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;1&quot;</span>, <span style="color: #0000ff;">&quot;Titre 1&quot;</span>, <span style="color: #0000ff;">&quot;bla bla&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    writer.<span style="color: #006633;">addDocument</span><span style="color: #009900;">&#40;</span>doc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Création et indexation d'un second document</span>
    doc <span style="color: #339933;">=</span> createDocument <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;2&quot;</span>, <span style="color: #0000ff;">&quot;Titre 2&quot;</span>, <span style="color: #0000ff;">&quot;titi tutu&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    writer.<span style="color: #006633;">addDocument</span><span style="color: #009900;">&#40;</span>doc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Création et indexation d'un troisième document</span>
    doc <span style="color: #339933;">=</span> createDocument <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;3&quot;</span>, <span style="color: #0000ff;">&quot;Titre 3&quot;</span>, <span style="color: #0000ff;">&quot;bla bla titi tutu&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    writer.<span style="color: #006633;">addDocument</span><span style="color: #009900;">&#40;</span>doc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Fermeture de l'index</span>
    writer.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>	    
&nbsp;
  <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">Document</span> createDocument <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> id, <span style="color: #003399;">String</span> titre,
                                        <span style="color: #003399;">String</span> texte<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Créer un document vide</span>
  <span style="color: #003399;">Document</span> doc <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Document</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Créer le champ id</span>
  doc.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Field</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;id&quot;</span>, id,
                     <span style="color: #003399;">Field</span>.<span style="color: #006633;">Store</span>.<span style="color: #006633;">YES</span>, <span style="color: #003399;">Field</span>.<span style="color: #006633;">Index</span>.<span style="color: #006633;">UN_TOKENIZED</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Créer le champ titre</span>
  doc.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Field</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;titre&quot;</span>, titre,
                     <span style="color: #003399;">Field</span>.<span style="color: #006633;">Store</span>.<span style="color: #006633;">YES</span>, <span style="color: #003399;">Field</span>.<span style="color: #006633;">Index</span>.<span style="color: #006633;">TOKENIZED</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// Créer le champ texte</span>
  doc.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Field</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;texte&quot;</span>, texte,
                     <span style="color: #003399;">Field</span>.<span style="color: #006633;">Store</span>.<span style="color: #006633;">NO</span>, <span style="color: #003399;">Field</span>.<span style="color: #006633;">Index</span>.<span style="color: #006633;">TOKENIZED</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">return</span> doc<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>On remarque que l&#8217;analyzer utilisé est spécifié au constructeur de l&#8217;objet IndexWriter. Et qu&#8217;un ensemble d&#8217;attributs importants sont spécifiés au constructeur de l&#8217;objet Field.</p>
<p>Le premier attribut est le mode de stockage de la donnée associée au champ : <em>Field.Store.YES</em> (stocké) ou <em>Field.Store.NO</em> (non stocké). Pour être indexé, une donnée ne doit pas forcément être stockée. On stockera un titre et un auteur par exemple car il doivent pouvoir être récupérés afin d&#8217;être affichés dans une liste de résultats. La totalité du texte d&#8217;un document PDF de 100 pages ne sera pas stocké mais juste indexé.</p>
<p>Le second attribut est le mode d&#8217;indexation de la donnée associée au champ : Field.Index.NO (non indexé), Field.Index.TOKENIZED (indexé avec découpage en mots), Field.Index.UN_TOKENIZED (indexé sans découpage en mots).</p>
<h4>Rechercher</h4>
<p>La recherche met en oeuvre 6 classes Lucene.</p>
<table style="width: 100%; height: 40px;" border="0" align="left">
<tbody>
<tr valign="top">
<td><strong>IndexSearcher</strong></td>
<td>c&#8217;est la classe qui donne accès aux index en recherche</td>
</tr>
<tr valign="top">
<td><strong>Analyzer</strong></td>
<td>
<p>Tout comme pour l&#8217;indexation les analyzer font partie du processus de recherche fin de normaliser les critères de recherche :</p>
</td>
</tr>
<tr valign="top">
<td><strong>QueryParser</strong></td>
<td>un parser de requête</td>
</tr>
<tr valign="top">
<td><strong>Query</strong></td>
<td>un objet qui représente la requête de l&#8217;utilisateur et utilisé par un IndexSearcher.</td>
</tr>
<tr>
<td><strong>Hits</strong></td>
<td>Une collection d&#8217;éléments résultats de la recherche</td>
</tr>
<tr>
<td><strong>Hit</strong></td>
<td>Un élément de la collection des résultats</td>
</tr>
<tr>
<td><strong>Document</strong></td>
<td>Un document retrouvé et tel qu&#8217;il était lors de son ajout dans l&#8217;index (constitué des mêmes champs)</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Le code suivant recherche les documents correspondant au critère et les affiche.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> searchAndDisplay <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> criteria<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
    IndexSearcher searcher <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> IndexSearcher<span style="color: #009900;">&#40;</span>INDEX_DIR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    QueryParser parser <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> QueryParser<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;texte&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> StandardAnalyzer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Query query <span style="color: #339933;">=</span> parser.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span>criteria<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Hits hits <span style="color: #339933;">=</span> searcher.<span style="color: #006633;">search</span><span style="color: #009900;">&#40;</span>query<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Résultats pour '&quot;</span> <span style="color: #339933;">+</span> criteria <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;': &quot;</span> <span style="color: #339933;">+</span> hits.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">Iterator</span> iter <span style="color: #339933;">=</span> hits.<span style="color: #006633;">iterator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>iter.<span style="color: #006633;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      Hit hit <span style="color: #339933;">=</span> iter.<span style="color: #006633;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">Document</span> doc <span style="color: #339933;">=</span> hit.<span style="color: #006633;">getDocument</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>doc.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;titre&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>	    	    
&nbsp;
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h4>Résultat de l&#8217;exécution</h4>
<pre>Résultats pour 'titi': 2
Titre 2
Titre 3
Résultats pour 'bla': 2
Titre 1
Titre 3
</pre>
<h3>Et si mes applications ne sont pas écrites en Java ?</h3>
<p>Si vous acceptez de ne pas utiliser la toute dernière version de Lucene, vous pouvez utiliser une version portée dans votre langage de programmation préféré. Il existe de nombreux portages : <a href="http://search.cpan.org/dist/Plucene/" target="_blank">Perl</a>, <a href="http://pylucene.osafoundation.org/" target="_blank">Python</a>, <a href="http://fr.wikipedia.org/wiki/Ferret_%28moteur_de_recherche%29" target="_blank">Ruby</a>, <a href="http://incubator.apache.org/lucene4c/" target="_blank">C</a>, <a href="http://sourceforge.net/projects/clucene/" target="_blank">C++</a>, <a href="http://incubator.apache.org/lucene.net/" target="_blank">.NET</a>, <a href="http://projects.heavymeta.org/montezuma/" target="_blank">Common Lisp</a> et <a href="http://framework.zend.com/" target="_blank">PHP</a> (recherche uniquement).</p>
<p>Si comme moi vous préférez utiliser la version originale Java en permanente évolution grâce à sa grande communauté de développeurs, voici ma suggestion : les <a href="http://fr.wikipedia.org/wiki/Web_services" target="_blank">Services Web</a>.</p>
<p>Vous avez écrit une application Web dont l&#8217;interface est en PHP et les données sont dans une base SQL. Vous n&#8217;avez pas le choix, il faut développer votre moteur de recherche avec Java. Par contre, il faut également interfacer ce moteur de recherche avec votre application PHP pour lancer les recherches et afficher les résultats.</p>
<p>Pour la partie indexation des données il n&#8217;est pas nécessaire de s&#8217;interfacer avec le PHP, une application Java autonome peut être développée. Par contre, pour la recherche il faut interfacer le code PHP avec le code Java. La solution consiste en la mise en place de <strong>Services Web</strong> écrits en Java et fonctionnants sous <strong>Tomcat</strong>. Il n&#8217;est pas nécessaire de se lancer dans des <strong>Services Web</strong> au standard <a href="http://fr.wikipedia.org/wiki/Web_services#Les_Services_Web_WS" target="_blank">SOAP</a>, le standard <a href="http://fr.wikipedia.org/wiki/Web_services#Les_Services_Web_de_type_REST" target="_blank">REST</a> est largement suffisant. En gros une requête HTTP est envoyée à une servlet qui elle même retourne des résultats au format XML. Cette méthode permet d&#8217;interfacer la recherche Java/Lucene à tous types d&#8217;applications (WEB ou non WEB) et écrites dans n&#8217; importe quel langage.</p>
<h3>Extensions de Lucene</h3>
<p>L&#8217;exemple présenté est comme je l&#8217;ai déjà dit &laquo;&nbsp;minimaliste&nbsp;&raquo;. Les possibilités offertes par Lucene sont très larges et se rapprochent des moteurs de recherche les plus puissants. En effet, il existe de nombreuses extensions fournies dans la distribution : analyzers avancées, corrections orthographiques, mise en évidence des termes recherchés dans les résultats, &#8230;</p>
<p>En voici la présentation dans la <a href="http://lucene.apache.org/java/docs/lucene-sandbox/index.html" target="_blank">Sandbox Lucene</a></p>
<h3>Utilitaires</h3>
<p>Voici deux utilitaires intéressants en phase de développement.</p>
<p><a href="http://www.getopt.org/luke/" target="_blank">Luke</a> &#8211; outils de monitoring et de consultation des index</p>
<p><a href="http://limo.sourceforge.net/" target="_blank">Limo</a> &#8211; outils de monitoring des index</p>
<h3>Documentation</h3>
<p>La documentation est disponible <a href="http://lucene.apache.org/java/docs/index.html" target="_blank">ici</a>. En plus de la javadoc, on y trouve une FAQ, un Wiki et différents articles intéressants.</p>
<p>jGuru fournit une <a href="http://www.jguru.com/faq/Lucene" target="_blank">FAQ Lucene</a> intéressante.</p>
<p>Et enfin, il existe un livre en anglais basé sur une déjà ancienne version 1.4 : <a href="http://www.eyrolles.com/Informatique/Livre/9781932394283/livre-lucene-in-action.php" target="_blank">Lucene in Action</a> (2004). La second édition du livre doit être disponible prochainement.</p>
<h3>Support et assistance</h3>
<p>Lucene est un projet open source, il n&#8217;existe pas de support à proprement parlé, mais il existe une <a href="http://lucene.apache.org/java/docs/mailinglists.html" target="_blank">mailing-list</a> et un <a href="http://www.nabble.com/Lucene-f44.html" target="_blank">forum</a> très actifs qui permettent d&#8217;obtenir de l&#8217;aide et des suggestions pour les problèmes les plus pointus.</p>
<h3>Projets utilisant Lucene</h3>
<p><a href="http://lucene.apache.org/solr/" target="_blank">Solr </a></p>
<p><a href="http://www.cdlib.org/inside/projects/xtf/" target="_blank">eXtensible Text Framework (XTF)</a></p>
<p><a href="http://www.hibernate.org/410.html" target="_blank">Hibernate Search</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2009/10/01/introduction-a-lucene/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CIA Investment Arm Taps Open Source Search</title>
		<link>http://www.wiizio.com/2009/06/16/cia-investment-arm-taps-open-source-search/</link>
		<comments>http://www.wiizio.com/2009/06/16/cia-investment-arm-taps-open-source-search/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 09:59:57 +0000</pubDate>
		<dc:creator>eric</dc:creator>
				<category><![CDATA[Actualité Moteur de Recherche Open Source]]></category>
		<category><![CDATA[logiciel_libre]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[moteur_de_recherche]]></category>
		<category><![CDATA[open_source]]></category>
		<category><![CDATA[search_engine]]></category>
		<category><![CDATA[Solr]]></category>

		<guid isPermaLink="false">http://www.wiizio.com/?p=43</guid>
		<description><![CDATA[
<p>June 16, 2009</p>

<p>In Washington, DC, yesterday (June 15, 2009), I learned that In-Q-Tel, the investment arm of the US intelligence community, has given a salute to open source. Lucid Imagination, a commercial open source company dedicated to supporting Apache Lucene and SOLR search technologies, received a strategic investment from In-Q-Tel.</p>
<p>Article d&#8217;origine</p>
]]></description>
			<content:encoded><![CDATA[<div>
<p>June 16, 2009</p>
</div>
<p>In Washington, DC, yesterday (June 15, 2009), I learned that <a href="http://www.iqt.org/" target="_blank">In-Q-Tel</a>, the investment arm of the US intelligence community, has given a salute to open source. Lucid Imagination, a commercial open source company dedicated to supporting Apache <a href="http://en.wikipedia.org/wiki/Lucene" target="_blank">Lucene</a> and <a href="http://en.wikipedia.org/wiki/Solr" target="_blank">SOLR</a> search technologies, received a strategic investment from In-Q-Tel.</p>
<p><a href="http://arnoldit.com/wordpress/2009/06/16/cia-investment-arm-taps-open-source-search/">Article d&#8217;origine</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wiizio.com/2009/06/16/cia-investment-arm-taps-open-source-search/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

