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.

    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

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le il y a 21 heures et 21 minutes

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le il y a 23 heures et 54 minutes

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59

- Perspective 3.0 pour Silverlight 5.0 par Perspective le 02-07-2012, 22:39