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

- Silverlight 3 : Communication et multicast par Kévin Gosse le il y a 6 heures et 9 minutes

- [Perso] Découvertes estivales : Linux (Part I) par Le blog de FremyCompany le il y a 8 heures et 50 minutes

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 23 heures et 26 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le 07-03-2009, 23:36

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le 07-03-2009, 09:56

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le 07-03-2009, 09:00

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 07-03-2009, 08:45

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15