Nessuno ha dato una risposta soddisfacente, quindi abbiamo iniziato a dare un'occhiata alla documentazione di Lucene e abbiamo scoperto che siamo in grado di farlo utilizzando Analizzatori e Tokenizzatori personalizzati.
La risposta è questa: creare un WhitespaceAndAtSymbolTokenizer e un WhitespaceAndAtSymbolAnalyzer, quindi ricreare il proprio indice utilizzando questo analizzatore. Una volta eseguita questa operazione, la ricerca di "@ gmail.com" restituirà tutti gli indirizzi Gmail, perché è vista come una parola separata grazie al Tokenizer appena creato.
Ecco il codice sorgente, in realtà è molto semplice:
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);
}
}
Questo è tutto! Ora hai solo bisogno di ricostruire il tuo indice e fare tutte le ricerche usando questo nuovo Analyzer. Ad esempio, per scrivere documenti per l'indice:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);
ricerche Performing dovrebbero usare l'analizzatore così:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);
fonte
2008-08-21 16:38:40
Passerei anche il tokenizer attraverso un LowerCaseFilter, o forse un LowerCaseFilter personalizzato che avrebbe solo in minuscolo il token @ GmAil.COM –