Como Usar Lucene.NET para Pesquisar Domínios de Endereços de Email

Pesquisar por endereços de email usando Lucene.NET pode ser um pouco desafiador devido à forma como o sistema de busca interpreta as strings. Se você já tentou pesquisar um domínio de email específico (como @gmail.com) e acabou com erros ou sem resultados, você não está sozinho. Este post no blog irá guiá-lo pelo processo de criação de uma solução de busca personalizada que permite consultar endereços de email de forma eficaz.

O Problema

Ao tentar pesquisar endereços de email em Lucene.NET, você pode enfrentar os seguintes problemas:

  • Erro com Asteriscos: Usar uma consulta wildcard como *@gmail.com resulta em um erro, já que asteriscos não podem iniciar uma consulta.
  • Limitações de Pesquisa de Palavras Inteiras: Executar uma consulta de pesquisa diretamente com @gmail.com não retornará resultados para endereços de email como foo@gmail.com, já que buscas lexicais normalmente tratam isso como uma palavra inteira.

Essas limitações podem ser frustrantes, especialmente quando você deseja pesquisar especificamente por domínio.

A Solução

Para resolver esse problema, podemos personalizar a maneira como o Lucene analisa e tokeniza endereços de email. Isso envolve a criação de dois componentes:

  1. Tokenizador: Comportamento personalizado para dividir texto em tokens com base em critérios.
  2. Analisador: Utilizando o tokenizador para criar um fluxo de tokens para indexação.

Passo 1: Criar um Tokenizador Personalizado

Começaremos criando um tokenizador personalizado chamado WhitespaceAndAtSymbolTokenizer. Este tokenizador irá tratar tanto o espaço em branco quanto o símbolo @ como indicadores de novas palavras, permitindo que dividamos endereços de email de forma mais eficaz.

Aqui está o código-fonte para o seu tokenizador personalizado:

class WhitespaceAndAtSymbolTokenizer : CharTokenizer
{
    public WhitespaceAndAtSymbolTokenizer(TextReader input)
        : base(input)
    {
    }

    protected override bool IsTokenChar(char c)
    {
        // Fazer com que caracteres em branco e o símbolo @ sejam indicadores de novas palavras.
        return !(char.IsWhiteSpace(c) || c == '@');
    }
}

Passo 2: Criar um Analisador Personalizado

Em seguida, implementaremos o WhitespaceAndAtSymbolAnalyzer, que usa nosso tokenizador personalizado:

internal class WhitespaceAndAtSymbolAnalyzer : Analyzer
{
    public override TokenStream TokenStream(string fieldName, TextReader reader)
    {
        return new WhitespaceAndAtSymbolTokenizer(reader);
    }
}

Passo 3: Recriar Seu Índice

Após configurar o tokenizador e o analisador personalizados, você precisará recriar seu índice usando o novo analisador. Veja como você pode fazer isso:

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

Passo 4: Realizar Pesquisas

Ao realizar pesquisas, certifique-se de usar também o analisador personalizado. Aqui está um simples trecho de código que demonstra como consultar usando o analisador:

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

Conclusão

Usando o WhitespaceAndAtSymbolTokenizer e o WhitespaceAndAtSymbolAnalyzer, você pode efetivamente pesquisar domínios de endereços de email em Lucene.NET. Esta solução não apenas resolve o problema imediato de buscar @gmail.com mas também estabelece uma base sólida para escalar suas buscas de domínios de email no futuro.


Misturar tokenização personalizada com estratégias de busca eficazes pode fazer uma diferença significativa em suas aplicações. Se você tiver mais perguntas ou precisar de assistência com sua implementação de Lucene.NET, fique à vontade para entrar em contato nos comentários abaixo!