.net - por - como saber el correo electronico de una persona en hotmail
Usando Lucene para buscar direcciones de correo electrónico (4)
Nadie dio una respuesta satisfactoria, así que comenzamos a hurgar en la documentación de Lucene y descubrimos que podemos lograr esto utilizando analizadores y tokenizadores personalizados.
La respuesta es esta: 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! Ahora solo necesita reconstruir su índice y hacer todas las búsquedas usando este nuevo Analizador. Por ejemplo, para escribir documentos en su índice:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);
La realización de búsquedas también debe usar el analizador:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);
Quiero usar Lucene (en particular, Lucene.NET) para buscar dominios de direcciones de correo electrónico.
Por ejemplo, quiero buscar "@ gmail.com" para encontrar todos los correos electrónicos enviados a una dirección de Gmail.
Al ejecutar una consulta de Lucene para "*@gmail.com" se produce un error, los asteriscos no pueden estar al inicio de las consultas. La ejecución de una consulta para "@ gmail.com" no devuelve ninguna coincidencia, porque "[email protected]" se ve como una palabra completa, y no puede buscar solo partes de una palabra.
¿Cómo puedo hacer esto?
Veo que tiene su solución, pero la mía lo habría evitado y agregado un campo a los documentos que está indexando llamado email_domain, en el que habría agregado el dominio analizado de la dirección de correo electrónico. Puede sonar tonto, pero la cantidad de almacenamiento asociado con esto es bastante mínimo. Si te apetece ser más elegante, por ejemplo, algunos dominios tienen muchos subdominios, en su lugar podrías crear un campo al que fuera el dominio invertido, por lo que almacenarías com.gmail, com.company.department o ae.eim para poder encontrar todas las direcciones relacionadas con los Emiratos Árabes Unidos con una consulta de prefijo de ''ae''.
Podría hacer un campo separado que indexe la dirección de correo electrónico invertida: Index ''[email protected]'' como ''moc.liamg@oof'' Lo que le permite hacer una consulta para "moc.liamg@*"
También hay setAllowLeadingWildcard
Pero ten cuidado Esto podría hacer que el rendimiento sea muy caro (por eso está deshabilitado por defecto). Tal vez en algunos casos esta sea una solución fácil, pero yo preferiría un Tokenizer personalizado como lo declara también Judah Himango .