Jump to content


Photo

Erro Nas Buscas


  • Faça o login para participar
14 replies to this topic

#1 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 25/02/2010, 15:04

Tenho meu sistema de busca usando FullText, porém ele elimina as palavras com menos de 3 caracteres

crei que para resolver issso eu teria q fazer o seguinte:

explode na $busca
separa as palavras menores que 3 caracteres
verifica se alguma dessas palavras é igual a (de, a, o, eu, no, na, etc...)
faço a busca das palavras pquenas com LIKE
faço a busca das palavras grandes com FullText

creio, q isso resolveria. Mas essa é só a lógica, não sei se dará certo e o pior...

Não sei como faço isso. :P (sou noob, aprendi php no Google)

Dpois q eu der o explode eu teria q usar um for pra testar cada palavra da array não é?

Quis funções eu uso pra fazer essa busca funcionar?

Desde já, THANK'S!! ^_^
Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net

#2 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 25/02/2010, 16:13

Amigo, boa tarde.
Tudo bom?

Porque não começa a esboçar uma query aqui e assim o pessoal vai lhe auxiliando..
Pelo que falou, vejo que não é tão noob quanto pensa e creio que a maioria aqui (assim como eu) também aprendeu PHP no Google.

Para o post não ficar de graça, comece usando o explode, replace e um foreach para alimentar uma variável $where.

Abraços e até a próxima.
Mateus Antunes
Mateus Antunes
MBASistemas

#3 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 26/02/2010, 15:17

Amigo, boa tarde.
Tudo bom?

Porque não começa a esboçar uma query aqui e assim o pessoal vai lhe auxiliando..
Pelo que falou, vejo que não é tão noob quanto pensa e creio que a maioria aqui (assim como eu) também aprendeu PHP no Google.

Para o post não ficar de graça, comece usando o explode, replace e um foreach para alimentar uma variável $where.

Abraços e até a próxima.
Mateus Antunes


Cara, VLW por responder...

Eu sei q explode vai separar as palavras
Dpois o replace vai tirar algumas palavras (e, ou, a, no, na, em, etc...)
Mas e o Foreach? e o que?
Um loop?
Como seria a sintaxe dessa função?
Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net

#4 Max William

Max William

    12 Horas

  • Usuários
  • 192 posts
  • Sexo:Masculino
  • Localidade:Maringá - Paraná

Posted 26/02/2010, 15:35

nada como o bom e velho php.net

foreach
http://br.php.net/ma...res.foreach.php
Se eu lhe ajudei ;) Clique para agradecer!

#5 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 26/02/2010, 15:53

hum...
entendi a função
ela vai varrenso a array e em cada loop traz o valor de uma chave (interessante)

comecei a fazer o começo da função...

######################################################################
//Faz a busca com as strings com menos de 2 caracteres

$string = explode(" ",$busca);

for($i=0; $i < sizeof($string); $i++){
	if (strlen($string[$i]) <= 3){
		echo "String <b>".$i."</b> Valor <b>".$string[$i]."</b><br />";
		//Criei uma array pra poder buscar no LIKE com ela
		$like[$i] = $string[$i];
	}//fim do if tamanho da string
	else{
		echo "Vou Procurar por <b>".$string[$i]."</b> usando Match!!";
                //Criei uma array pra poder buscar no MATCH com ela
		$match[$i] = $string[$i];
	}//fim do else
}//fim do for
echo "<p>Esta busca contém <b>".sizeof($string)."</b> palavras.</p>";

######################################################################

Fui no sistema e Pesquisei por "tv pet online" o resultado exibido foi o seguinte:


String 0 Valor tv
String 1 Valor pet
Vou Procurar por online usando Match!!

Esta busca contém 3 palavras.


Até aí tudo bem. Parece q tudo está nos conformes..
Agora alguém aí sabe como que eu posso ELIMINAR as palavras (junções) dessa $string
Exemplo
Se eu procurar por:
"Chinelo e Sandália"
O sistema usaria MATCH para "Chinelo" e para "Sandália", mas usaria LIKE para "e", ou seja, traria praticamente TODO o banco nos resultados.

como que eu vou eliminar as palavras de junções da string?
Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net

#6 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 26/02/2010, 17:33

Bom amigo, vamos dando sequencia.

Uma ideia (Apenas para ter de onde começar) é retirar as palavras com 1 caracter.
Outra ideia é salvar em um array todas as junções que não quer (trabalhoso inicialmente mas é uma saida) e depois usando o in_array() você pode evitar a busca...

Isso, obviamente, são só ideias para que você tenha de onde começar...

Não deixe de retornar aqui sua evolução até que a função fique como quer!

Abraços e até a próxima.
Mateus Antunes
Mateus Antunes
MBASistemas

#7 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 27/02/2010, 09:58

Bom amigo, vamos dando sequencia.

Uma ideia (Apenas para ter de onde começar) é retirar as palavras com 1 caracter.
Outra ideia é salvar em um array todas as junções que não quer (trabalhoso inicialmente mas é uma saida) e depois usando o in_array() você pode evitar a busca...

Isso, obviamente, são só ideias para que você tenha de onde começar...

Não deixe de retornar aqui sua evolução até que a função fique como quer!

Abraços e até a próxima.
Mateus Antunes

Bom eu fiz o seguinte:

como o str_replace estava eliminando apenas um caratere da array (de "na" passava para "n") a solução foi colocar as palavras com 3 caracteres 1º, dpois as com 2 e por fim as com 1. Isso resolveu essa parte!

Mas temos agora outro problema:

Eliminando as palavras que não quero eu terei um valor NULL naquela chave da array, se eu fizer uma busca com LIKE utilizando um valor NULL, (creio eu) vou ter TODOS os resultados do banco!!! E vai ser pior do q fazer só com uma palavra. ^^

Após mudar a ordem das palavras que não quero pesquisei por: "foi na feira comprar café"

O retornado foi o seguinte:

String 0 Valor
String 1 Valor
Vou Procurar por feira usando Match!!
Vou Procurar por comprar usando Match!!
Vou Procurar por café usando Match!!

Esta busca contém 5 palavras.
Vou procurar por feira comprar café


Repare que a Chave 0 e a Chave 1 da array estão agora com sem valor (NULL). Isso pq eu defini as palavras "foi" e "na" na array que não quero.


O que devo fazer para não efetuar a busca usando valores NULL na array?
Ou estou errado? pesquisar com LIKE com valor NULL não traz TUDO do banco?

Thank's
Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net

#8 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 27/02/2010, 20:48

Tenho meu sistema de busca usando FullText, porém ele elimina as palavras com menos de 3 caracteres

ft_min_word_len: http://dev.mysql.com...ft_min_word_len

Mas eu sinceramente acho que palavras com menos de 3 caracteres são descartáveis. :ponder:

[]’sAté mais

#9 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 28/02/2010, 08:18

Tenho meu sistema de busca usando FullText, porém ele elimina as palavras com menos de 3 caracteres

ft_min_word_len: http://dev.mysql.com...ft_min_word_len

Mas eu sinceramente acho que palavras com menos de 3 caracteres são descartáveis. :ponder:

[]’s

Eu tbm não gosto da idéia de usar palavras pequenas, mas não tenho muita opção.

Veja só:
No sistema tem um site cadastrado "Tv Pet Online". Se eu procurar por "TV PET" me é retornado um "op's, não encontrei."

Eu tenho q usar as palavras, não tenho muitas opções. ¬¬

VLW!!
Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net

#10 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 28/02/2010, 09:34

Pois bem, se você tem acesso ao my.cnf, é só alterar a diretiva ft_min_word_len. ;-)

[]’sAté mais

#11 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 01/03/2010, 15:19

Pois bem, se você tem acesso ao my.cnf, é só alterar a diretiva ft_min_word_len. ;-)

[]’s

Estamos quase lá.!!

Se eu, simplesmente, alterar a diretiva, as consultas q contém junções ("e", "na", "no", etc...) vão retornar muita coisa do banco. Não é isso que eu quero.

Quero fazer a busca com palavras pequenas mas antes eu quero testar pra ver se a palavra não está entre as que eu não quero.

Se pesquisar por = "Hospedagem de Sites"
a junção "de" vai retornar mmuuuuuuuuuuiiiiiiiittttaaaaaaaaaaa coisa do banco! Não é esse meu objetivo!

Thank's for your Help!!
Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net

#12 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 01/03/2010, 15:27

Se você acesso ao my.cnf, você também pode usar diretiva ft_stopword_file para apontar para um arquivo de stopwords, ou palavras a se ignorar na busca FULLTEXT. Basta inserir tais junções neste arquivo, apontá-lo em ft_stopword_file e usar o REPAIR TABLE ... QUICK para reindexar a tabela.

Mas claro, tudo isso com acesso ao my.cnf. ;-)

[]’sAté mais

#13 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 02/03/2010, 14:22

Se você acesso ao my.cnf, você também pode usar diretiva ft_stopword_file para apontar para um arquivo de stopwords, ou palavras a se ignorar na busca FULLTEXT. Basta inserir tais junções neste arquivo, apontá-lo em ft_stopword_file e usar o REPAIR TABLE ... QUICK para reindexar a tabela.

Mas claro, tudo isso com acesso ao my.cnf. ;-)

[]’s

Interessante...
Vou verificar se possuo acesso a esse arquivo, mas creio que vá ser pouco provável...

Sem Chance...


Num tenhu acesso ao my.cnf ¬¬

Eae?! creio que o ideal eh criar uma função que faça a exclusão dessas palavras. certo?

Edição feita por: AlessandroWeb, 02/03/2010, 14:22.

Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net

#14 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 02/03/2010, 16:48

Amigo, boa tarde.

Você pode seguir na linha que vinha antes.
Faça um array de palavras que não quer pesquisar e consulte com a função in_array
As palavras que não estiverem no array de palavras excluídas, você monta em uma busca com LIKE.

É claro que isso é só uma ideia.
Quando terminar sua função, se puder, adicione-a ai =D

Abraços!
Mateus Antunes
Mateus Antunes
MBASistemas

#15 AlessandroWeb

AlessandroWeb

    Turista

  • Usuários
  • 56 posts
  • Sexo:Masculino
  • Localidade:Suzano / SP

Posted 02/03/2010, 17:59

@MBA

acho q vai ter q ser issu mesmo...
Mas vou ter q adiar por uns dias, to com uns sistemas atrasados aqui.
Acho q semana que vem eu já faço essa função, aí posto aqui pra todos os que estiverem precisando tbm! ^^

Eu tenho uma outra dúvida, mas vou criar novo tópico (assunto é diferente) pra não virar bagunça!

VLW pela força!! T+
Atenciosamente,
Alessandro Santos.
igloo Internet Solutions
www.igloointernet.net




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq