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 wiefoo@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:
- Tokenizer: Benutzerdefiniertes Verhalten zum Aufteilen von Text in Tokens basierend auf bestimmten Kriterien.
- 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!