.net - utente - Usare Lucene per cercare indirizzi email




trovare una persona tramite email (3)

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: crea un WhitespaceAndAtSymbolTokenizer e un WhitespaceAndAtSymbolAnalyzer, quindi ricrea il tuo indice usando 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 nel tuo indice:

IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);

Effettuare ricerche dovrebbe usare anche l'analizzatore:

IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);

Voglio usare Lucene (in particolare, Lucene.NET) per cercare domini di indirizzi email.

Ad esempio, desidero cercare "@ gmail.com" per trovare tutte le email inviate a un indirizzo Gmail.

L'esecuzione di una query Lucene per "*@gmail.com" genera un errore, gli asterischi non possono essere all'inizio delle query. L'esecuzione di una query per "@ gmail.com" non restituisce corrispondenze, perché "[email protected]" è visto come una parola intera e non è possibile cercare solo parti di una parola.

Come posso fare questo?


Vedo che hai la soluzione, ma la mia avrebbe evitato questo e aggiunto un campo ai documenti che stai indicizzando chiamato email_domain, in cui avrei aggiunto il dominio analizzato dell'indirizzo email. Potrebbe sembrare sciocco, ma la quantità di spazio di archiviazione associata a questo è piuttosto ridotta. Se hai voglia di crescere, dire che alcuni domini hanno molti sottodomini, potresti invece creare un campo in cui è stato eseguito il dominio inverso, quindi memorizzerai com.gmail, com.company.department o ae.eim in modo da poter trovare tutti gli indirizzi relativi agli Emirati Arabi Uniti con una domanda prefissata di "ae".


C'è anche setAllowLeadingWildcard

Ma stai attento . Questo potrebbe ottenere molto costose prestazioni (questo è il motivo per cui è disabilitato di default). Forse in alcuni casi questa sarebbe una soluzione facile, ma preferirei un Tokenizer personalizzato come dichiarato da Judah Himango .





lucene