Erro Nas Buscas
#1
Posted 25/02/2010, 15:04
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. (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!!
#2
Posted 25/02/2010, 16:13
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
- AlessandroWeb likes this
#3
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?
#4
#5
Posted 26/02/2010, 15:53
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?
#6
Posted 26/02/2010, 17:33
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
- AlessandroWeb likes this
#7
Posted 27/02/2010, 09:58
Bom eu fiz o seguinte: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
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
#8
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_lenMas eu sinceramente acho que palavras com menos de 3 caracteres são descartáveis.
[]sAté mais
- AlessandroWeb likes this
#9
Posted 28/02/2010, 08:18
Eu tbm não gosto da idéia de usar palavras pequenas, mas não tenho muita opção.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.
[]’s
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!!
#10
Posted 28/02/2010, 09:34
[]sAté mais
- AlessandroWeb likes this
#11
Posted 01/03/2010, 15:19
Estamos quase lá.!!Pois bem, se você tem acesso ao my.cnf, é só alterar a diretiva ft_min_word_len.
[]’s
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!!
#12
Posted 01/03/2010, 15:27
REPAIR TABLE ... QUICK
para reindexar a tabela.Mas claro, tudo isso com acesso ao my.cnf.
[]sAté mais
- AlessandroWeb likes this
#13
Posted 02/03/2010, 14:22
Interessante...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
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.
#14
Posted 02/03/2010, 16:48
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
#15
Posted 02/03/2010, 17:59
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+
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)