Como encontrar sobremesas com a letra a em bancos de dados
O problema parece simples no início. Você tem uma lista de receitas e precisa filtrar apenas aquelas cujos nomes contenham a letra "a". Parece coisa de exercício de nível introdutório de programação, mas na prática aparece em projetos reais com frequência suficiente para causar dor de cabeça.Eu estava trabalhando numa API de recomendação de pratos quando precisei implementar esse filtro. O objetivo era permitir que os usuários buscassem por sobremesas específicas usando um parâmetro de busca simples. O primeiro chute foi fazer uma query com LIKE '%a%' no banco de dados. Funcionou. Depois testei com uns 15 mil registros e percebi que a consulta estava voltando resultados inesperados.
Detalhes práticos sobre sobremesas com a letra a
O problema principal não é encontrar a letra. É entender como os acentos e a ortografia dos nomes das sobremesas brasileiras e portuguesas interferem na busca. "Brigadeiro" tem "a"? Não. "Mousse" tem? Também não. Mas "Pudim" já começa com P e não tem A. A lógica é mais complexa do que parece porque nomes como "Torta de Maçã" têm o "ã" que em muitos sistemas é convertido para "a" simples, mas em outros não. Minha primeira tentativa falhou porque não considerei a normalização de caracteres. O PostgreSQL com collation padrão trata "ã" como diferente de "a" em comparações do tipo ILIKE. Isso significa que uma torta de maçã podia não aparecer em uma busca por "maça". A solução que funcionou foi usar a função unaccent do contrib module do PostgreSQL junto com to_lower, convertendo tudo antes de comparar.
SELECT nome, ingredientes
FROM sobremesas
WHERE unaccent(to_lower(nome)) LIKE unaccent('%a%');
Isso resolveu 80% dos casos. O problema residual veio quando encontrei nomes compostos como "Pavê de Chocolate" onde o acento agudo no ê não era tratado pelo unaccent. Aí precisei adicionar uma camada extra de normalização com uma função customizada que substitui especificamente os caracteres acentuados comuns em português: á, à, â, ã, æ, ç, é, ê, í, ó, ô, ò, õ, ú, ç.
Performance e otimização
Em uma tabela com 50 mil registros de receitas, a consulta ingênua com LIKE '%a%' fazia full table scan em cada execução. O tempo médio de resposta era de 2,3 segundos. Isso é inaceitável para uma API que precisa responder em menos de 200ms. A solução foi criar um índice de expression function que armazena o nome normalizado da sobremesa. O índice em si não melhora performance mágica. Ele permite que o planner do PostgreSQL use um index scan ao invés de sequentially scan. No meu caso, o tempo caiu para 12ms em média, com pico de 45ms em condições de carga. A diferença é significativa quando você tem múltiplas requisições concorrentes.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Uma pegadinha importante: se você estiver usando MongoDB, a situação é diferente. O operador $regex não é sensível a acentos por padrão. Você precisa usar collation com strength: 1 na conexão ou fazer pré-processamento no application layer. Isso aumenta a latência em cerca de 80ms por operação, mas é necessário.
Casos de uso e limitações
Esse método funciona bem para buscas de texto puro em nomes de receitas. Não serve para buscar dentro dos ingredientes, a não ser que você normalise e indexe também esse campo. Se o seu objetivo é encontrar todas as sobremesas que contêm "açúcar" nos ingredientes, a abordagem muda completamente porque você precisa de fuzzy matching ou edição de distância, não apenas de substring matching. Também tem limitações com nomes históricos ou regionais. "Beijinho" não tem "a" no nome, mas "Biscoito Beijinho" tem. "Quindim" não tem "a", mas "Quindim de Coco" também não. A busca é estritamente sobre a string do nome, não sobre o conceito culinário. Isso pode frustrar usuários que esperam resultados semânticos.
Outro problema que encontrei: nomes com espaços extras, hífens ou caracteres especiais. "Cheesecake" pode ser escrito como "Cheese Cake" ou "Cheesecake". Sem um normalizador robusto de whitespace, você acaba duplicando registros ou perdendo matches. A solução que adotei foi trim, replace de múltiplos espaços por um único, e depois comparação. Para projetos menores, com menos de 10 mil registros, a simplificação com LIKE direto pode ser suficiente. A otimização com índices só vale a pena quando a escala justifica o custo de manutenção. Fique atento também à questão de performance em ambientes serverless, onde cold starts podem adicionar 500ms à primeira requisição após deploy.
Se você precisar de uma versão Python para processamento em batch, a biblioteca ftfyunicodedata normalization resolve a maioria dos casos. Em JavaScript no Node, oIntl.Segmenter com option de language 'pt-BR' oferece segmentação correta para nomes com acentos. A escolha depende do stack e do volume de dados.