kahoz Posted June 6, 2006 at 10:21 PM Report Share #31534 Posted June 6, 2006 at 10:21 PM boas noites, nos sistemas de pesquisa que desenvolvo tenho utilizado nas querys coisas como "LIKE '% texto %'" ou "LIKE '%texto%'", que se tem revelado inificazes.. entertanto soube recentemente que é possível usar regex em sql, mas como não domino o assunto (regex), como é que faço para procurar por um caracter ? .. obg desde já (; -lopes. Link to comment Share on other sites More sharing options...
pedrotuga Posted June 7, 2006 at 12:16 PM Report Share #31586 Posted June 7, 2006 at 12:16 PM Epa... aí está uma questão que me desperta a curiosidade. Já andei pelas mailing lists e pelos fóruns oficiais do mysql e nunca me deram ajuda nenhuma neste ponto. Eu uso esse tipo de pesquisa... na verdade funciona sem problemas... mas olhando assim a frio não tem nada bom aspecto. O máximo que me disseram foi: "dependendo da situação isso até pode na verdade servir" epa... isto para mim n é ajudar... assim como a minha resposta n é grande ajuda... pa... boa sorte... se descobrires qual a forma de fazer isso em condições afixa aí que eu tb estou curioso. Link to comment Share on other sites More sharing options...
kahoz Posted June 25, 2006 at 03:19 PM Author Report Share #34713 Posted June 25, 2006 at 03:19 PM bem, acho que descobri algo ainda melhor que regex 😉 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html ps: só tem o defeito de ter stopwords.. para siglas não dá jeito. abraço! ps: o smiliey onde o gajo pisca o olho.. epá.. o gajo parece que nao sabe piscar! lol -lopes. Link to comment Share on other sites More sharing options...
kingless Posted June 25, 2006 at 10:21 PM Report Share #34786 Posted June 25, 2006 at 10:21 PM kahoz, acho que o LIKE é melhor do que o fulltext... Link to comment Share on other sites More sharing options...
kahoz Posted June 26, 2006 at 10:57 PM Author Report Share #34997 Posted June 26, 2006 at 10:57 PM O problema é que o LIKE apanha tudo o que tiver no meio do texto. Se procurar por '%maos%', o sgbd devolve resultados onde esteja contido 'irmaos' (ok sei que falta o til mas acho que percebeste..) era este tipo de situações que queria evitar. E depois outra, ordena os resultados por relevância.. 😛 -lopes. Link to comment Share on other sites More sharing options...
kingless Posted June 27, 2006 at 02:36 AM Report Share #35005 Posted June 27, 2006 at 02:36 AM em vez de colocares '%palavra%' podes só colocar '%Palavra' ou 'Palavra%' dependo que queres procurar... Link to comment Share on other sites More sharing options...
Dabubble Posted June 27, 2006 at 03:15 PM Report Share #35071 Posted June 27, 2006 at 03:15 PM full text search com indexes invertidos e muito mais rapido do que LIKE Link to comment Share on other sites More sharing options...
kingless Posted June 27, 2006 at 08:05 PM Report Share #35112 Posted June 27, 2006 at 08:05 PM Dabubble, acho que se fulltext fosse mais rapido que o LIKE os pesquisadores feitos em php utilizariam fulltext e não LIKE Link to comment Share on other sites More sharing options...
kahoz Posted June 28, 2006 at 11:58 PM Author Report Share #35387 Posted June 28, 2006 at 11:58 PM em vez de colocares '%palavra%' podes só colocar '%Palavra' ou 'Palavra%' dependo que queres procurar... like '%palavra' or like 'palavra%' e like '%palavra%' é a mesma coisa.. ? -lopes. Link to comment Share on other sites More sharing options...
kingless Posted June 29, 2006 at 10:29 AM Report Share #35419 Posted June 29, 2006 at 10:29 AM Não... '%ABC' <- Isto procura por palavras que terminem com ABC 'ABC%' <- Isto procura por palavras que começem com ABC '%ABC%' <- Isto procura por palavras que têm ABC Tipo antes de dizeres que são a mesma coisa podias tentar pesquisar... Link to comment Share on other sites More sharing options...
M6 Posted June 29, 2006 at 01:17 PM Report Share #35455 Posted June 29, 2006 at 01:17 PM Esse é um problema com que as BDs se deparam muitas vezes. Uma solução genérica passa pelo uso da % em cláusulas like, onde o utilizador pode definir onde colocar o símbolo % (ou usar o * que é normalmente um simbolo mais conhecido e depois trocar o * por %). Outras vezes é dada a hipótese do utilizador escolher se a pesquisa deve ser um AND ou um OR para todas as palavras usadas, ou seja: - AND: select * from tabela where campo like '%caracteres1%' AND campo like '%caracteres2%' AND ... AND campo like '%caracteresN%' - OR : select * from tabela where campo like '%caracteres1%' OR campo like '%caracteres2%' OR ... OR campo like '%caracteresN%' Por vezes o sistema não pede nada ao utilizador e assum uma das estratégias acima. Isto pode evoluir para algo mais complexo, do tipo, o utilizador dizer "chars1 AND (chars2 OR chars3)", mas não creio que tal seja necessário aqui. Outra estratégia, mais pesada e menos usada, é usar % entre cada caracter: select * from tabela where campo like '%caracter1%caracter2%...%caracterN%' Se o FullTextSearch te resolve o problema e não causa impacto na performance, usa-o, caso contrário podes usa uma das estratégias acima. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
kingless Posted June 29, 2006 at 01:50 PM Report Share #35468 Posted June 29, 2006 at 01:50 PM M6 para pesquisas utiliza-se o LIKE porque é melhor, exemplo se tu queres criar um pesquisador que procura por conteúdos no teu site tu utilizas LIKE e não fulltext.... Ele quer fazer procuras e para procuras o melhor é utilizar LIKE. E para veres que se utiliza mais o LIKE abre os ficheiros do php-nuke, joomla, mambo etc... Link to comment Share on other sites More sharing options...
M6 Posted June 29, 2006 at 05:21 PM Report Share #35512 Posted June 29, 2006 at 05:21 PM M6 para pesquisas utiliza-se o LIKE porque é melhor, exemplo se tu queres criar um pesquisador que procura por conteúdos no teu site tu utilizas LIKE e não fulltext.... Ele quer fazer procuras e para procuras o melhor é utilizar LIKE. E para veres que se utiliza mais o LIKE abre os ficheiros do php-nuke, joomla, mambo etc... Isso que afirmas é demasiado radical e nem sequer é suportado por factos. Uso o LIKE há muito anos e sei bem que o mesmo é o mais usado, em especial por ser uma cláusula implementada em "todos" os SGBDs. No entanto, o facto de se usar mais o LIKE não quer dizer que o Full Text não seja a melhor solução para um determinado caso. O Full Text Index é muito superior ao Like, permite efectuar pesquisas mais complexas que com o Like podem ser extremamente complexas e pesadas. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
kahoz Posted June 29, 2006 at 06:04 PM Author Report Share #35517 Posted June 29, 2006 at 06:04 PM Não... Tipo antes de dizeres que são a mesma coisa podias tentar pesquisar... entao SELECT * FROM tabela WHERE campo LIKE '%palavra' OR campo LIKE 'palavra%' e SELECT * FROM tabela WHERE campo LIKE '%palavra%' .. nao dá os mesmos resultados ? -lopes. Link to comment Share on other sites More sharing options...
kingless Posted June 29, 2006 at 06:08 PM Report Share #35519 Posted June 29, 2006 at 06:08 PM Epa... Usa como quiseres já não falo mais nada! Link to comment Share on other sites More sharing options...
M6 Posted June 30, 2006 at 08:54 AM Report Share #35605 Posted June 30, 2006 at 08:54 AM Não... Tipo antes de dizeres que são a mesma coisa podias tentar pesquisar... entao SELECT * FROM tabela WHERE campo LIKE '%palavra' OR campo LIKE 'palavra%' e SELECT * FROM tabela WHERE campo LIKE '%palavra%' .. nao dá os mesmos resultados ? Não obrigatoriamente, no primeiro caso estrás à procura de texto que começa ou termina por 'palavra', no segundo estás à procura de texto onde existe 'palavra'. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
mAiN_iNfEcTiOn Posted July 12, 2006 at 01:09 PM Report Share #37790 Posted July 12, 2006 at 01:09 PM Yah... do tipo.... +-------------+ | Barco | +-------------+ | Mar | +-------------+ | Arma | +-------------+ Com o LIKE '%ar%' vai mostrar os registos todos da tabela acima... Com o LIKE 'ar%' vai mostrar o registo arma... Com o LIKE '%ar' vai mostrar o registo mar... Logo, ao fazer LIKE 'ar%' OR LIKE '%ar' (a sintaxe ta mal, mas é para usarem a logica xD) mas vai mostrar os registos todos da tabela acima menos Barco, pois este nem começa com 'ar', nem acaba com 'ar'... Link to comment Share on other sites More sharing options...
Dabubble Posted July 12, 2006 at 01:28 PM Report Share #37792 Posted July 12, 2006 at 01:28 PM Dabubble, acho que se fulltext fosse mais rapido que o LIKE os pesquisadores feitos em php utilizariam fulltext e não LIKE Tipo usa-se LIKE para querys simples e porque esta a mao e porque todos os SGBDs utilizam. Se percebes de base de dados o que acontece e o seguinte se fizeres um like a uma determinada coluna podem acontecer duas coisas: Se a coluna estiver indexada a pesquisa e relativamente rapida mas e feita num index normal ou seja tens de percorrer o index quase todo mas ate nem e muito mau por que um index normal ate e eficiente Se a coluna nao estiver indexada (muitas sgbds nao permitem indexar colunas com um comprimento mais do que X) tens de fazer um FULL TABLE SCAN para teres os resultados de um LIKE As SGBDS que possibilitam o uso de Full text search fazem-no com indexes invertidos e isto significa que o que o index guarda e um conjunto de termos (as palavras) que apontam para os documentos (linhas da tabela e, por vezes, posicao nessas linhas) que as contêm. Esta estrutura faz com que as pesquisas sejam muito mais rapidas, para tabelas grandes normalmente duas ordens de magnitude ou mas a diferenca aumenta com o aumento da tabela. Desvantagem e que se fica agarrado a SGBD porque normalmente cada uma implementa com a sua propria sintaxe e nem todas tem a funcionalidade (dai as ferramentas que mencionaste nao usarem). Para dar a volta a tal problema pode-se utilizar uma ferramenta como o Lucene para indexares tu proprio o que percisas de pesquisar. EDIT: Para o problema que tu indicaste inicialmente (de procurares por mao e aparecer irmao) o full text search e a solucao isto porque ele so te da um match se a palavra for a mesma e nao parecida (alguns processao acentos e raizes etimologicas para descobrir palavras identicas) Outra coisa ainda na questao do LIKE nao e o que e melhor ou pior e o que deve ser utilizado em cada situacao para procurar palavras numa coluna de uma tabela um full text search e melhor, agora se estas por exemplo a procura de todas as palavras acabam em kk koisa ou que contem kk koisa no meio ai full text search nao funciona e tem de usar LIKE. Isto tem a haver com a maneiro como os indices sao contruidos... Link to comment Share on other sites More sharing options...
mAiN_iNfEcTiOn Posted July 12, 2006 at 07:35 PM Report Share #37852 Posted July 12, 2006 at 07:35 PM E já que falamos em FULLTEXT... Eu tenho ideia de que as pesquisas FULLTEXT são boas para campos grandes do tipo LONGTEXT onde não sabemos a Key Length para o indíce... (nota: sou 1 kito n00b ainda, se tiver a dizer asneiras CORRIJAM-ME) Já as pesquisas com LIKE têm como base campos mais pekenos do tipo VARCHAR que vão até 255 caracteres.. salvo erro... A minha dúvida (caso aquilo esteja correcto) é a seguinte... Porque é que as pesquisas FULLTEXT são MUITO mais LENTAS quando envolvem campos de várias tabelas??? É por fazerem pesquisas em variados INDEXES?... Link to comment Share on other sites More sharing options...
Dabubble Posted July 12, 2006 at 09:39 PM Report Share #37884 Posted July 12, 2006 at 09:39 PM E já que falamos em FULLTEXT... Eu tenho ideia de que as pesquisas FULLTEXT são boas para campos grandes do tipo LONGTEXT onde não sabemos a Key Length para o indíce... (nota: sou 1 kito n00b ainda, se tiver a dizer asneiras CORRIJAM-ME) Já as pesquisas com LIKE têm como base campos mais pekenos do tipo VARCHAR que vão até 255 caracteres.. salvo erro... A minha dúvida (caso aquilo esteja correcto) é a seguinte... Porque é que as pesquisas FULLTEXT são MUITO mais LENTAS quando envolvem campos de várias tabelas??? É por fazerem pesquisas em variados INDEXES?... 1º Full text e sempre melhor para procurar por palavras inteiras do que LIKE que era a situacao inicial deste topico (talvez nao para pouquissimos registos mas torna-se aparente cedo (< 500)) Full Text usa um indice complexo cuja escrita nao e triviar, assim algumas outras operacoes podem ser atrasadas por usar full text (mas normalmente e negligenciavel) 2º LIKE faz o match na procura por uma sequencia de caracteres (FT faz a toda a palavra) servindo para pesquisas diferentes Agora finalmente respondendo a tua pergunta: Sim e nao 😄 depende do tipo de full text engine que uses, os SGBDS podem criar varios indices ou so um (dependendo de qual e) se bem que o caso normal e terem varias (pelo menos um por tabela e por vezes um por coluna). A pesquisa e sem duvida mais lenta, numa relacao directamente propocional ao nomero de indices pesuisados. A solucao e implementares tu o tem proprio indice 😄 e (relativamente) facil de fazer e tem a vantagem que podes incluir conteudo HTML para alem do conteudo da tua base de dados Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now