Executando verificação de segurança...
8

Como? cara to perdido como vou fazer isso?

Galera, hoje publiquei aqui sobre meu projeto Lista Smart.

Agora estou numa fase que parece simples… mas está se mostrando um baita desafio 😅

Minha prioridade no momento é melhorar a busca de produtos dentro da plataforma.

Pra isso estou focando em duas coisas:

  • 📷 adicionar fotos dos produtos
  • 🏷️ adicionar tags e variações de busca

As fotos eu já sei que vão dar trabalho (catálogo grande, padronização, etc.), mas o que realmente está me tirando o sono são as buscas com erro de digitação.

Exemplo real:

Usuário quer buscar:

Heineken

Mas digita:

rainiquem

Ou:

heinekem
heinneken
heiniken

E mesmo assim o sistema deveria entender que ele provavelmente quis dizer Heineken.

Pelo que andei pesquisando, isso envolve técnicas de fuzzy search / fuzzy matching, que permitem encontrar termos semelhantes mesmo quando há erros de digitação ou variações na grafia.

Essas técnicas usam algoritmos que medem a similaridade entre strings, como a distância de edição (ex: quantas letras precisam mudar para transformar uma palavra em outra). ([Meu Redator][2])

Mas antes de sair implementando qualquer coisa, queria ouvir a experiência de quem já passou por isso.

Algumas dúvidas que estou tentando resolver:

  • vale mais a pena usar fuzzy search direto no banco ou um motor de busca tipo Meilisearch / Elastic?
  • alguém já implementou busca tolerante a erro para catálogo de produtos?
  • faz sentido gerar automaticamente tags e aliases para cada produto?

Exemplo:

Heineken
heiniken
heinneken
heinekem
rainiquem
cerveja heineken

Ou existe alguma abordagem melhor?


Se alguém tiver sugestões de arquitetura, libs ou estratégias para resolver isso de forma escalável, vou ficar muito grato.

A ideia é melhorar bastante a experiência de busca dentro do Lista Smart.

Qualquer insight é bem-vindo 🙌

Carregando publicação patrocinada...
2
1

Isso é dificíl de implementar mesmo. O recomendado é pegar pronto devido a complexidade.

No entanto, se quiser entender melhor como isso funciona, recomendo da uma olhada no algoritmo Breadth first search. É com ele que descobrimos o caminho mais provavél de A para B.

Eu tenho um projeto somente para estudos que demonstra como isso funciona de maneira realmente simples, mas o core da ideia esta presente: word-ladder

Não mais, esse tipo de coisa foge do escopo do teu projeto. Existem diversas soluções por ai.

faz sentido gerar automaticamente tags e aliases para cada produto

O que posso dizer é que, gerenciar tags e aliases no banco de dados não é brincadeira a menos que faça isso com rigor. Uma hora isso vai se expandir tanto e pode se tornar difícil de lidar, com tags redundantes e coisas do tipo. É difícil dizer se é esse é o melhor caminho por não conhecer o escopo do teu projeto com exatidão, mas no mínimo, recomendo testar em ambiete controlado antes de implementar, pois voltar atrás é muito difícil.


Existem outros algoritmos melhorem para o seu maior problema do que Breadth first search, mas é um bom começo para começar a entender o problema melhor.

0

Meus 2 cents,

Antigamente uma forma legal de resolver isso era busca fonetica (soundex) - mesmo que a pessoa digitasse errado, conseguia achar. O maior problema é que os algoritmos de soundex sao basicamente para ingles - na epoca (anos 90) trabalhei numa empresa que implementou do zero um soundex em pt-br.

Mas o tempo passa, o tempo voa - hoje provavelmente resolveria de outra forma.

Bem, as sugestoes do @maniero e @Programmer404 sao otimas, vale a pena a leitura.

Mas tentei tambem via gepeto para ver as recomendacoes (e fazem sentdo):

prompt: "aja como um engenheiro de software com 20 anos de experiencia. preciso que uma lista onde o usuario vai digitar um termo tenha procura inteligente, conseguindo achar mesmo quando tem erros ortograficos. Estive pensando em soundex, lista semantica ou algo como tokenizacao. Sugestoes ?"

https://chatgpt.com/share/69b800b6-f3d4-8008-95a5-81e9687fada2

No gemini foi parecido:

## User:

aja como um engenheiro de software com 20 anos de experiencia. preciso que uma lista onde o usuario vai digitar um termo tenha procura inteligente, conseguindo achar mesmo quando tem erros ortograficos. Estive pensando em soundex, lista semantica ou algo como tokenizacao. Sugestoes ?"

## Gemini:

Fala, colega. Vinte anos de estrada me ensinaram uma coisa: o usuário sempre vai digitar errado, e a sua solução precisa ser robusta o suficiente para não deixá-lo na mão, mas sem destruir a performance do banco de dados.

Você citou **Soundex**, **Lista Semântica** e **Tokenização**. Vamos colocar os "pingos nos is" sob a ótica de quem já viu essas implementações falharem e terem sucesso em produção.

----------------------------------------------------------------------------------------------------

### Análise das suas sugestões**Soundex:** É um algoritmo fonético clássico. O problema? Ele foi desenhado para o inglês e foca muito no som da primeira letra. Para o português, ele é bem "burro". Se o usuário digitar "Kasa" em vez de "Casa", ele até ajuda, mas para erros de digitação (typos) como "Cassa", ele perde o fôlego.
    
・ **Lista Semântica:** Excelente para contexto (ex: buscar "carro" e achar "veículo"), mas não resolve erro de digitação. É uma camada de inteligência acima da busca textual.
    
・ **Tokenização:** É o feijão com arroz. Sem quebrar a frase em termos (tokens), você não faz nada. Mas sozinha, ela só busca termos exatos.
    

----------------------------------------------------------------------------------------------------

### O que eu realmente recomendo (O "Combo do Engenheiro")

Se você quer algo que funcione de verdade em 2026, esqueça o Soundex puro. Foque nestes três pilares:

#### 1. Distância de Levenshtein (Fuzzy Search)

Essa é a rainha da correção de erros. Ela calcula quantos caracteres você precisa mudar, inserir ou deletar para transformar a string A na string B.

・ **Exemplo:** "Pyton" para "Python" tem distância 1.
    
・ **Dica de senior:** Não rode Levenshtein puro no SQL em toda a base (é lento). Use um índice de **Trigramas** antes.
    

#### 2. N-Grams (Trigramas)

Quebre as palavras em pedaços de 3 letras.

・ **Exemplo "Banana":** `ban`, `ana`, `nan`.
    
・ Se o usuário digita "Bananna", os trigramas batem quase todos, e o motor de busca traz o resultado por similaridade. O PostgreSQL tem o módulo `pg_trgm` que faz isso de forma performática.
    

#### 3. Algoritmos Fonéticos Modernos (Double Metaphone)

Se a busca precisa ser pelo "som", o **Double Metaphone** é muito superior ao Soundex. Ele gera duas chaves para cada palavra, cobrindo variações de pronúncia muito melhor, inclusive para nomes estrangeiros.

----------------------------------------------------------------------------------------------------

### Resumo das Ferramentas

| Tecnologia | Complexidade | Quando usar |
| --- | --- | --- |
| **Elasticsearch / Solr** | Alta | Se você tem milhões de registros e precisa de busca "nível Google". Já vem com _Fuzziness_ nativo. |
| **PostgreSQL (pg\_trgm)** | Baixa | Se os dados já estão no banco e a lista é de tamanho médio. É o melhor custo-benefício. |
| **Fuse.js** | Mínima | Se a lista é pequena (alguns milhares) e você quer fazer a busca direto no navegador do usuário (Client-side). |

### Meu veredito

Se você quer resolver isso rápido e bem feito:

1.  Use **Tokenização** para limpar o input (remover stop words, acentos e converter para lowercase).
    
2.  Implemente **Fuzzy Matching** baseado em **Trigramas**. Isso vai cobrir 90% dos erros ortográficos comuns.
    
3.  Se o "significado" for crucial, aí sim você espeta uma biblioteca de **Sinônimos** ou uma API de Embeddings (IA) por cima, mas só se o orçamento permitir o custo computacional.
    

**Quer que eu te mostre um exemplo de como implementar um índice de trigramas no SQL ou prefere ver como configurar o Fuse.js para o front-end?**

Acho que eh isto - espero que ajude

Saude e Sucesso !

-1

Tem um jeito praticamente zero-cost de fazer:

  • Imagem você gera cache com n tamanhos
  • Você estraga o texto certo

Essa última depende muito mas a ideia é assim:

Você, pega o texto original que está escrito certo e transcreve todos os erros comuns de uma vez e depois faz o mesmo na entrada do usuário:

  • H no início é tratado como r fora do português
  • Hei é lido como Rai
  • Q, C e K geralmente tem som de
  • Terminação em en, in e em é lido como im

Então:

  • Heineken

Vira:

  • rainekin

Mas olha que interessante:

  • rainequem

Vira:

  • rainekin

Ou seja, a coluna search não precisa ter todas as variações e a transformação pode ir no frontend

A forma tradicional de busca difusa tem custo computacional relativamente alto, dependendo do caso uma implementação caseira é mais eficiente