Question

Je veux utiliser Lucene (en particulier, Lucene.NET recherche pour l'adresse de courriel domaines.

E. g.Je veux de la recherche pour "@gmail.com" pour trouver tous les e-mails envoyés à une adresse gmail.

L'exécution d'une requête Lucene pour "*@gmail.com" les résultats d'une erreur, les astérisques ne peut pas être au départ de requêtes.L'exécution d'une requête pour "@gmail.com" ne renvoie pas tout les matchs, parce que "foo@gmail.com" est considéré comme un mot entier, et vous ne pouvez pas rechercher d'une partie d'un mot.

Comment puis-je faire cela?

Était-ce utile?

La solution

Personne n'a donné une réponse satisfaisante, nous avons donc commencé à fouiller Lucene documentation et découvert que nous pouvons accomplir cela en utilisant des Analyseurs et des générateurs de jetons.

La réponse est celle-ci:créer un WhitespaceAndAtSymbolTokenizer et un WhitespaceAndAtSymbolAnalyzer, puis le recréer votre index à l'aide de cet analyseur.Une fois que vous faites cela, une recherche pour "@gmail.com" retournera toutes les adresses gmail, car il est vu comme un mot séparé grâce au générateur de jetons que nous venons de créer.

Voici le code source, c'est en fait très 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);
    }
}

Ça y est!Maintenant, vous avez juste besoin de reconstruire votre index et de faire toutes les recherches à l'aide de ce nouvel Outil.Par exemple, pour écrire des documents de votre index:

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

En effectuant des recherches devraient utiliser l'analyseur ainsi:

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

Autres conseils

Je vois que vous avez votre solution, mais la mienne aurait pu éviter cela et ajout d'un champ pour les documents dont vous êtes l'indexation appelé email_domain, dans lequel j'aurais ajouté l'analysé de domaine de l'adresse e-mail.Cela peut paraître idiot, mais la quantité de stockage associé à cela est assez minime.Si vous avez envie de vous amateur, disent certains de domaine a de nombreux sous-domaines, vous pouvez à la place faire un champ dans lequel l'inversion de domaine est allé, de sorte que vous ne magasin com.gmail, com.de l'entreprise.département, ou de l'ae.eim, de sorte que vous pourriez trouver toutes les Émirats Arabes Unis adresses liées avec un préfixe de requête de 'ae.'

Il y a aussi setAllowLeadingWildcard

Mais attention.Cela pourrait devenir très performances cher (c'est pourquoi elle est désactivée par défaut).Peut-être, dans certains cas, ce serait une solution de facilité, mais je préfère personnalisé générateur de jetons comme l'a déclaré Juda Himango, trop.

Vous pourriez un champ distinct que les indices de l'adresse e-mail inversée:L'indice de foo@gmail.com' en tant que 'moc.liamg@oof' Qui vous permet d'effectuer une requête pour "moc.liamg@*"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top