Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maykel-ctba

Busca por termos aproximados - Como fazem?

Recommended Posts

Fala galera!

Tenho um banco de dados com muitos produtos (em MYSQL) e o sistema de busca roda via PHP. Hoje, este sistema pega a palavra digitada, joga em algo parecido com isso: 

WHERE termo LIKE '%termo%'

Porém, o cliente diz que muitos dos termos pesquisados são escritos errados (erros de gramática, nomes errados de produtos).

 

Existe alguma solução simples para resolver tal questão? Buscar por aproximação de caracteres talvez, mas algo que não pese tanto na hora de fazer? Como é feito geralmente?

 

Postei no PHP pois não sei se isso se resume meramente a MySQL, mas fiquem a vontade para mover as questões qualquer caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, fala Maykel, beleza ? Na verdade diz respeito ao MySQL, neste caso.  Procure por FullText Search, dê uma lida neste artigo pra clarear:

https://pt.blog.marceloaltmann.com/en-using-the-mysql-fulltext-index-search-pt-utilizando-mysql-fulltext/

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você quer fazer não é muito fácil, existe um algoritmo do mysql chamado SOUNDEX e é bem limitado.

 

Ou funções como Levenshtein

 

Porém você pode usar o auto-complete do Google para tentar contornar isso.

http://google.com/complete/search?q=vue js&output=toolbar

 

javacript <------------

http://google.com/complete/search?q=javacript&output=toolbar

 

Usando com o que o Alarte disse, full text, mas full text não é pra achar termos escritos errados.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, se entendi bem, da pra fazer usando o modo BOLEANO, "IN BOLEAN MODE" na consulta, como atributo do AGAINST, pois é possível alterar a ordem de relevância.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Alaerte Gabriel beleza? Muito obrigado pelo artigo!

 

Uma dúvida... o Fulltext é uma espécie de índice? Para cada campo que for usado na busca, tenho que alterar a fulltext key?

 

Outra coisa: O fulltext é aplicado para busca de vários termos "espalhados" numa string, certo? Mas se as strings forem escritas erroneamente (erros gramaticais, por ex), ele nada pode fazer, correto?

 

@Williams Duarte obrigado pelos artigos! Darei uma olhada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí Maykel. É preciso fazer alguns testes, eu acredito que mesmo com a escrita errônea ele possa ainda assimilar algo.

 

12 horas atrás, Maykel-ctba disse:

Uma dúvida... o Fulltext é uma espécie de índice? Para cada campo que for usado na busca, tenho que alterar a fulltext key?

Isso, Você precisa adicionar o fulltext nos campos da seguinte maneira:

ALTER TABLE tabela ADD FULLTEXT(titulo, descricao);

O comando acima cria um índice fulltext composto dos campos titulo e descricao, na tabela. Dessa forma, a consulta feita sobre esse índice levará em consideração a ocorrência do texto pesquisado nos dois campos.

 

ou

CREATE FULLTEXT INDEX INDEX_FT_DESCRICAO ON tabela (titulo,descricao) ;

Esta linha cria um índice fulltext chamado INDEX_FT_DESCRICAO para os campos titulo e descricao.

 

Na criação da tabela:

CREATE TABLE websites( post_id mediumint(8) unsigned NOT NULL, titulo varchar(100) NOT NULL, descricao text, PRIMARY KEY (post_id), FULLTEXT (titulo, descricao));

O comando acima implementa o mesmo índice fulltext na tabela.

Evite criar índices fulltext em tabelas que sofrerão alguma rotina de importação, pois a carga de registros com esse índice é mais lenta. O ideal é criar o índice depois que a importação for concluída.

 

 

Dê uma lida neste excelente artigo complementar de onde tirei as informações:

http://www.devmedia.com.br/indices-fulltext-no-mysql/7631

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Preciso fazer uma busca antes de inserir um registro no banco de dados.

      No caso preciso verificar se existe uma frase no banco antes de cadastrar uma nova.
       
      Exemplo:
       
      Tenho no banco a coluna ASSUNTO = "Morre David Johansen, vocalista dos New York Dolls, aos 75 anos".
       
      Quando vou cadastrar uma nova notícia "Morre, aos 75 anos, David Johansen, do New York Dolls" é parecida. Mas não quero cadastrar 2 vezes.
       
      No like não consigo fazer esta busca.... o que posso fazer para verificar esta busca antes de cadastrar ?
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.