Niemand gab eine befriedigende Antwort, also begannen wir, in der Lucene-Dokumentation herumzustochern und stellten fest, dass wir dies mit benutzerdefinierten Analysatoren und Tokenizern erreichen konnten.
Die Antwort lautet wie folgt: Erstellen Sie einen WhitespaceAndAtSymbolTokenizer und einen WhitespaceAndAtSymbolAnalyzer und erstellen Sie dann Ihren Index mit diesem Analysator neu. Sobald Sie dies tun, wird eine Suche nach "@ gmail.com" alle Google Mail-Adressen zurückgeben, da es dank des Tokenizers, den wir gerade erstellt haben, als separates Wort angesehen wird.
Hier ist der Quellcode, es ist eigentlich sehr einfach ist:
class WhitespaceAndAtSymbolTokenizer : CharTokenizer
{
public WhitespaceAndAtSymbolTokenizer(TextReader input)
: base(input)
{
}
protected override bool IsTokenChar(char c)
{
// Make whitespace characters and the @ symbol be indicators of new words.
return !(char.IsWhiteSpace(c) || c == '@');
}
}
internal class WhitespaceAndAtSymbolAnalyzer : Analyzer
{
public override TokenStream TokenStream(string fieldName, TextReader reader)
{
return new WhitespaceAndAtSymbolTokenizer(reader);
}
}
Das ist es! Jetzt müssen Sie nur Ihren Index neu erstellen und alle Suchvorgänge mit diesem neuen Analyzer durchführen. Zum Beispiel Dokumente zu Ihrem Index schreiben:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);
Suchen durchführen sollen auch den Analysator verwenden:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);
Ich würde auch den Tokenizer durch einen LowerCaseFilter übergeben, oder vielleicht einen benutzerdefinierten LowerCaseFilter, der nur das Token @ GmAil.COM –