Comment utiliser Lucene.NET pour rechercher des domaines d’adresses e-mail

Rechercher des adresses e-mail à l’aide de Lucene.NET peut être un peu difficile en raison de la façon dont le système de recherche interprète les chaînes. Si vous avez déjà essayé de rechercher un domaine de messagerie spécifique (comme @gmail.com) et que vous avez rencontré des erreurs ou aucun résultat, vous n’êtes pas seul. Cet article de blog vous guidera à travers le processus de création d’une solution de recherche personnalisée qui vous permettra d’interroger efficacement des adresses e-mail.

Le Problème

Lorsque vous essayez de rechercher des adresses e-mail dans Lucene.NET, vous pourriez rencontrer les problèmes suivants :

  • Erreur avec les Astérisques : Utiliser une requête par wildcard comme *@gmail.com entraîne une erreur, car les astérisques ne peuvent pas commencer une requête.
  • Limitations de la recherche par mot entier : Exécuter une requête de recherche directement avec @gmail.com ne renverra pas de résultats pour des adresses e-mail comme foo@gmail.com, car les recherches lexicales traitent généralement cela comme un mot entier.

Ces limitations peuvent être frustrantes, surtout lorsque vous souhaitez rechercher spécifiquement par domaine.

La Solution

Pour résoudre ce problème, nous pouvons personnaliser la façon dont Lucene analyse et tokenize les adresses e-mail. Cela implique de créer deux composants :

  1. Tokeniseur : Comportement personnalisé pour diviser le texte en tokens selon certains critères.
  2. Analyseur : Utilisation du tokenizeur pour créer un flux de tokens pour l’indexation.

Étape 1 : Créer un Tokeniseur Personnalisé

Nous allons commencer par créer un tokenizeur personnalisé appelé WhitespaceAndAtSymbolTokenizer. Ce tokenizeur considérera à la fois les espaces vides et le symbole @ comme des indicateurs de nouveaux mots, ce qui nous permettra de diviser les adresses e-mail plus efficacement.

Voici le code source pour votre tokenizeur personnalisé :

class WhitespaceAndAtSymbolTokenizer : CharTokenizer
{
    public WhitespaceAndAtSymbolTokenizer(TextReader input)
        : base(input)
    {
    }

    protected override bool IsTokenChar(char c)
    {
        // Faire en sorte que les caractères d'espacement et le symbole @ soient des indicateurs de nouveaux mots.
        return !(char.IsWhiteSpace(c) || c == '@');
    }
}

Étape 2 : Créer un Analyseur Personnalisé

Ensuite, nous mettrons en œuvre le WhitespaceAndAtSymbolAnalyzer, qui utilise notre tokenizeur personnalisé :

internal class WhitespaceAndAtSymbolAnalyzer : Analyzer
{
    public override TokenStream TokenStream(string fieldName, TextReader reader)
    {
        return new WhitespaceAndAtSymbolTokenizer(reader);
    }
}

Étape 3 : Reconstruire Votre Index

Après avoir configuré le tokenizeur et l’analyseur personnalisés, vous devrez recréer votre index en utilisant le nouvel analyseur. Voici comment vous pouvez le faire :

IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);

Étape 4 : Effectuer des Recherches

Lorsque vous effectuez des recherches, assurez-vous d’utiliser également l’analyseur personnalisé. Voici un exemple de code simple qui montre comment interroger en utilisant l’analyseur :

IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);

Conclusion

En utilisant le WhitespaceAndAtSymbolTokenizer et le WhitespaceAndAtSymbolAnalyzer, vous pouvez rechercher efficacement des domaines d’adresses e-mail dans Lucene.NET. Cette solution ne résout pas seulement le problème immédiat de recherche de @gmail.com, mais établit également une base solide pour étendre vos recherches de domaines d’e-mail à l’avenir.


Mélanger une tokenisation personnalisée avec des stratégies de recherche efficaces peut faire une différence significative dans vos applications. Si vous avez d’autres questions ou besoin d’assistance avec votre implémentation de Lucene.NET, n’hésitez pas à nous le faire savoir dans les commentaires ci-dessous !