Korzystanie z Lucene do wyszukiwania adresów e-mail

Chcę użyć Lucene (w szczególności, Lucene.NET), aby wyszukać domeny adresów e-mail.

Np. chcę szukać "@gmail.com " aby znaleźć wszystkie e-maile wysłane na adres gmail.

Uruchamianie zapytania Lucene dla "*@gmail.com " powoduje błąd, gwiazdki nie mogą znajdować się na początku zapytań. Uruchamianie zapytania dla "@gmail.com " nie zwraca żadnych zapałek, ponieważ "[email protected]" jest postrzegane jako całe słowo i nie można szukać tylko części słowa.

How can I do to?

Author: Mark Biek, 2008-08-21

4 answers

Nikt nie dał satysfakcjonującej odpowiedzi, więc zaczęliśmy grzebać w dokumentacji Lucene i odkryliśmy, że możemy to osiągnąć za pomocą niestandardowych analizatorów i Tokenizerów.

Odpowiedź jest taka: Utwórz WhitespaceAndAtSymbolTokenizer i WhitespaceAndAtSymbolAnalyzer, a następnie odtworzyć indeks za pomocą tego analizatora. Gdy to zrobisz, Szukaj "@gmail.com " zwróci wszystkie adresy gmail, ponieważ jest postrzegane jako osobne słowo dzięki Tokenizerowi, który właśnie stworzyliśmy.

Oto kod źródłowy jest bardzo prosty:

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);
    }
}
To jest to! Teraz wystarczy odbudować indeks i wykonać wszystkie wyszukiwania za pomocą tego nowego analizatora. Na przykład, aby zapisać dokumenty do indeksu:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);

Podczas wyszukiwania należy również użyć analizatora:

IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);
 12
Author: Judah Himango,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-21 21:52:02

Widzę, że masz swoje rozwiązanie, ale moje uniknęłoby tego i dodałoby pole do indeksowanych dokumentów o nazwie email_domain, do którego dodałbym przetworzoną domenę adresu e-mail. Może to zabrzmieć głupio, ale ilość miejsca związanego z tym jest dość minimalna. Jeśli masz ochotę na więcej, powiedzmy, że jakaś domena miała wiele subdomen, możesz zamiast tego zrobić pole, do którego trafiła odwrócona domena, więc zachowasz com.gmail, com.Towarzystwo.Departament, lub ae.eim, dzięki czemu można znaleźć wszystkie adresy związane ze Zjednoczonymi Emiratami Arabskimi z prefiksem zapytania 'ae.'

 5
Author: dlamblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-22 21:07:01

Jest też setAllowLeadingWildcard

Ale bądź ostrożny . Może to być bardzo kosztowne (dlatego jest domyślnie wyłączone). Może w niektórych przypadkach byłoby to łatwe rozwiązanie, ale wolałbym Niestandardowy Tokenizer, jak stwierdził Judah Himango .

 2
Author: Markus Lux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:13:34

Możesz utworzyć osobne pole indeksujące odwrócony adres e-mail: Indeks "[email protected]" as " moc.liamg@oof" Który umożliwia wykonanie zapytania o " moc.liamg@ * "

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 14:13:41