Wie man Lucene.NET zur Suche nach E-Mail-Domain-Adressen verwendet

Die Suche nach E-Mail-Adressen mit Lucene.NET kann aufgrund der Art und Weise, wie das Suchsystem Zeichenfolgen interpretiert, etwas herausfordernd sein. Wenn Sie jemals versucht haben, nach einer bestimmten E-Mail-Domain (wie @gmail.com) zu suchen und dabei auf Fehler oder keine Ergebnisse gestoßen sind, sind Sie nicht allein. Dieser Blogbeitrag führt Sie durch den Prozess der Erstellung einer benutzerdefinierten Suchlösung, mit der Sie E-Mail-Adressen effektiv abfragen können.

Das Problem

Bei dem Versuch, E-Mail-Adressen in Lucene.NET zu suchen, können Sie auf folgende Probleme stoßen:

  • Fehler mit Platzhaltern: Die Verwendung einer Wildcard-Abfrage wie *@gmail.com führt zu einem Fehler, da Platzhalter nicht mit einer Abfrage beginnen können.
  • Einschränkungen bei der Ganzwortsuche: Das Durchführen einer Suchanfrage direkt mit @gmail.com gibt keine Ergebnisse für E-Mail-Adressen wie foo@gmail.com zurück, da lexikalische Suchen sie typischerweise als Ganzes betrachten.

Diese Einschränkungen können frustrierend sein, insbesondere wenn Sie gezielt nach einer Domain suchen möchten.

Die Lösung

Um dieses Problem anzugehen, können wir die Art und Weise anpassen, wie Lucene E-Mail-Adressen analysiert und tokenisiert. Dies umfasst die Erstellung von zwei Komponenten:

  1. Tokenizer: Benutzerdefiniertes Verhalten zum Aufteilen von Text in Tokens basierend auf bestimmten Kriterien.
  2. Analyzer: Verwendung des Tokenizers zur Erstellung eines Tokenstroms für die Indizierung.

Schritt 1: Erstellen eines benutzerdefinierten Tokenizers

Wir beginnen mit der Erstellung eines benutzerdefinierten Tokenizers namens WhitespaceAndAtSymbolTokenizer. Dieser Tokenizer behandelt sowohl Leerzeichen als auch das @-Symbol als Indikatoren für neue Wörter, was uns ermöglicht, E-Mail-Adressen effektiver zu trennen.

Hier ist der Quellcode für Ihren benutzerdefinierten Tokenizer:

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

    protected override bool IsTokenChar(char c)
    {
        // Leerzeichen und das @-Symbol als Indikatoren für neue Wörter behandeln.
        return !(char.IsWhiteSpace(c) || c == '@');
    }
}

Schritt 2: Erstellen eines benutzerdefinierten Analyzers

Als Nächstes implementieren wir den WhitespaceAndAtSymbolAnalyzer, der unseren benutzerdefinierten Tokenizer verwendet:

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

Schritt 3: Ihren Index neu aufbauen

Nachdem der benutzerdefinierte Tokenizer und Analyzer eingerichtet wurden, müssen Sie Ihren Index mit dem neuen Analyzer neu erstellen. So können Sie das tun:

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

Schritt 4: Suchen durchführen

Beim Durchführen von Suchen stellen Sie sicher, dass Sie auch den benutzerdefinierten Analyzer verwenden. Hier ist ein einfacher Codeausschnitt, der zeigt, wie Sie mit dem Analyzer abfragen können:

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

Fazit

Mit dem WhitespaceAndAtSymbolTokenizer und dem WhitespaceAndAtSymbolAnalyzer können Sie E-Mail-Domain-Adressen in Lucene.NET effektiv durchsuchen. Diese Lösung behebt nicht nur das unmittelbare Problem, nach @gmail.com zu suchen, sondern schafft auch eine solide Grundlage für die Skalierung Ihrer E-Mail-Domain-Suchen in der Zukunft.


Die Kombination aus benutzerdefinierter Tokenisierung und effektiven Suchstrategien kann einen erheblichen Unterschied in Ihren Anwendungen ausmachen. Wenn Sie weitere Fragen haben oder Unterstützung bei Ihrer Lucene.NET-Implementierung benötigen, zögern Sie nicht, unten in den Kommentaren zu fragen!