Nadie dio una respuesta satisfactoria, por lo que comenzamos a hurgar en la documentación de Lucene y descubrimos que podemos lograr esto utilizando Analizadores y Tokenizadores personalizados.
La respuesta es la siguiente: cree un WhitespaceAndAtSymbolTokenizer y un WhitespaceAndAtSymbolAnalyzer, luego vuelva a crear su índice con este analizador. Una vez que hagas esto, una búsqueda de "@ gmail.com" devolverá todas las direcciones de Gmail, ya que se ve como una palabra separada gracias al Tokenizer que acabamos de crear.
Aquí está el código fuente, en realidad es muy simple:
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);
}
}
eso es todo! Ahora solo necesita reconstruir su índice y hacer todas las búsquedas usando este nuevo Analizador. Por ejemplo, para escribir documentos en el índice:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);
búsquedas escénicas deben utilizar el analizador, así:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);
También pasaría el tokenizer a través de un LowerCaseFilter, o quizás un CustomCaseFilter personalizado que solo minería el token de @GmAil.COM –