Vra

Ek wil Lucene (in die besonder, Lucene.NET) gebruik om te soek na e-pos adres domeine.

Bv. Ek wil om te soek na "@ gmail.com" om alle e-pos gestuur word aan 'n gmail adres te vind.

As jy 'n Lucene navraag vir "*@gmail.com" resultate in 'n fout, kan sterretjies nie aan die begin van navrae. Bestuur van 'n navraag vir "@ gmail.com" geen wedstryde terugkeer, want "foo@gmail.com" word beskou as 'n geheel woord, en jy kan nie soek vir net dele van 'n woord.

Hoe kan ek dit doen?

Was dit nuttig?

Oplossing

Niemand het 'n bevredigende antwoord, so ons begin skeer rond Lucene dokumentasie en ontdek kan ons dit te bewerkstellig met behulp van persoonlike Analiseerders en Tokenizers.

Die antwoord is dit: skep 'n WhitespaceAndAtSymbolTokenizer en 'n WhitespaceAndAtSymbolAnalyzer, dan herskep jou indeks met behulp van hierdie ontleder. Sodra jy dit doen, 'n soeke na "@ gmail.com" sal terugkeer al gmail adresse, want dit is gesien as 'n aparte woord te danke aan die Tokenizer ons net geskep.

Hier is die bron-kode, dit is eintlik baie eenvoudig:

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);
    }
}

Dit is dit! Nou moet jy net om jou indeks herbou en doen alle navrae met behulp van hierdie nuwe Analyzer. Byvoorbeeld, om dokumente om jou indeks skryf:

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

Die uitvoer van soektogte moet die ontleder sowel gebruik:

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

Ander wenke

Ek sien jy het jou oplossing, maar myne sou dit vermy en bygevoeg 'n veld om die dokumente wat jy kruip genoem EMAIL_DOMAIN, waarin ek die ontleed uit domein van die e-posadres sal bygevoeg het. Dit mag dalk klink dom, maar die bedrag van die stoor wat verband hou met hierdie is redelik minimaal. As jy voel soos om liefhebber, sê sommige domein het baie subdomeinen, kan jy plaas 'n stuk grond in die omgekeerde domein gegaan maak, sodat jy com.gmail, com.company.department, of ae.eim wil stoor, sodat jy kan vind al die Verenigde Arabiese Emirate met betrekking adresse met 'n voorvoegsel navraag van 'ae. "

Daar is ook setAllowLeadingWildcard

Maar wees versigtig . Dit kan baie prestasie duur (dis hoekom dit is afgeskakel by verstek) kry. Miskien in sommige gevalle sou dit 'n maklike oplossing wees, maar ek sal 'n persoonlike Tokenizer verkies soos deur Juda Himango ook.

Jy kan 'n aparte gebied wat indekse die e-posadres omgekeer: Indeks 'foo@gmail.com' as 'moc.liamg@oof' Wat jou in staat stel om 'n navraag te doen vir "moc.liamg@*"

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top