Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    Consultant freelance, n'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Lucene - ignorer les accents lors de l'indexation et la recherche | ignore diacritics

Lucene.net est un moteur de recherche écrit en C#, il s'agit du portage du projet lucene écrit en Java. Ce moteur est très rapide, simple à mettre en place et gratuit, parmi les sites qui l'utilisent on peut noter le site wikipedia.

Lorsque vous créez un index ou une requête de recherche, vous avez besoin d'un analyseur. Cet analyseur va, entre autres, effectuer des traitements sur les mots. Par exemple, si vous recherchez le mot clé "Ecrans", l'analyseur pourra convertir ce mot en "ecran". Ainsi vous obtiendrez des résultats comportant le mot "Ecran" (avec une majuscule) ou "ecrans" (au pluriel) lorsque vous rechercherez "ecran".

Il existe plusieurs Analyseur natif dans Lucene, ce post n'a pas pour objectif de détailler les différents analyseur ainsi que leur fonctionnement, je vous invite à consulter cet article : Lucene.Net - Text Analysis si vous souhaitez plus d'information.
Il existe d'autres analyseur plus complexe, le plus utilisé est certainement SnowBall qui permet de supprimer le pluriel des mots, les conjugaisons, etc ... ou alors les mots bruyants/inutiles comme "le", "avec", ...  
Si vous utilisez Lucene vous avez tout interêt à utiliser cet analyseur.

Bien que très pratique, SnowBall ne permet pas de supprimer les accents des mots (aussi appelé signe diacritique), ainsi "écran" est différent de "ecran".

Voici un bout de code illustrant ce problème :

static void Main(string[] args) { // Creation de l'index en memoire Directory directory = new RAMDirectory(); // Creation de l'analyseur pour des mots en francais Analyzer analyzer = new SnowballAnalyzer("French"); IndexWriter writer = new IndexWriter(directory, analyzer); Document doc; // ajout des documents dans l'index doc = new Document(); doc.Add(new Field("ID", "1", Field.Store.YES, Field.Index.NO)); doc.Add(new Field("Content", "ecran", Field.Store.NO, Field.Index.TOKENIZED)); writer.AddDocument(doc); doc = new Document(); doc.Add(new Field("ID", "2", Field.Store.YES, Field.Index.NO)); doc.Add(new Field("Content", "écran", Field.Store.NO, Field.Index.TOKENIZED)); writer.AddDocument(doc); // fermeture de l'index writer.Optimize(); writer.Close(); // creation de la requete de recherche QueryParser parser = new QueryParser("Content", analyzer); Query query = parser.Parse("ecran"); // Recherche Searcher searcher = new IndexSearcher(directory); Hits hits = searcher.Search(query); Console.WriteLine(hits.Length()); // affiche 1 }

Pour ignorer les accents et faire en sorte que "écran" = "ecran", nous devons faire notre propre Analyzer.
Pour cela nous allons hériter de la classe SnowballAnalyzer, surcharger la méthode TokenStream et utiliser le filtre ISOLatin1AccentFilter qui permet de supprimer les accents.

class MyAnalyzer : SnowballAnalyzer { public MyAnalyzer(String language) : base(language) { } public override TokenStream TokenStream(string fieldName, TextReader reader) { TokenStream result = base.TokenStream(fieldName, reader); result = new ISOLatin1AccentFilter(result); return result; } }

Ensuite, il vous suffit d'utiliser la classe MyAnalyzer au lieu de SnowballAnalyzer afin de ne plus prendre en considération les accents lors de l'indexation et de la recherche.

Si vous regardez le code de la classe ISOLatin1AccentFilter, vous noterez qu'elle ne fait pas que supprimer les accents (diacritics), mais aussi les ligatures ainsi cœur = cœur.

D'autres astuces au niveau des analyseurs Lucene ? 

Posted: jeudi 8 janvier 2009 16:14 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [MIX10] Keynote deuxième journée – Internet Explorer 9, Html5, Visual Studio 2010, OData par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 17 heures et 11 minutes

- Certifications beta .NET 4 par Kévin Gosse le il y a 17 heures et 18 minutes

- [Mix 2010] – Microsoft Translator Technology Preview V2 par RedoBlog - The .NET Gentleman !!! le il y a 17 heures et 58 minutes

- Lancement en Preview de Cyclone lors des TechDays 2010! par Blog de Frédéric Queudret le il y a 20 heures et 21 minutes

- [WP7] Je ne veux pas d’un nouvel iPhone par Le blog de FremyCompany le il y a 23 heures et 40 minutes

- [WF4] Pourquoi utiliser le ContentPresenter dans l’ActivityDesigner? par Blog de Jérémy Jeanson le 03-17-2010, 07:54

- [Mix 2010] – Telechargez Internet Explorer 9 en Preview ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:58

- [MIX 2010] – Keynote Day 2 online : Windows Internet Explorer 9, jQuery, OData et Dallas CTP2 ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:18

- [Mix 2010] – Retour d’expérience développement Seesmic sur Windows Phone 7 par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:44

- [Mix 2010] – Le Keynote Day 1 disponible online ! par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:21