kahoz Posted June 6, 2006 at 10:21 PM Report #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.
pedrotuga Posted June 7, 2006 at 12:16 PM Report #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.
kahoz Posted June 25, 2006 at 03:19 PM Author Report #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.
kingless Posted June 25, 2006 at 10:21 PM Report #34786 Posted June 25, 2006 at 10:21 PM kahoz, acho que o LIKE é melhor do que o fulltext...
kahoz Posted June 26, 2006 at 10:57 PM Author Report #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.
kingless Posted June 27, 2006 at 02:36 AM Report #35005 Posted June 27, 2006 at 02:36 AM em vez de colocares '%palavra%' podes só colocar '%Palavra' ou 'Palavra%' dependo que queres procurar...
Dabubble Posted June 27, 2006 at 03:15 PM Report #35071 Posted June 27, 2006 at 03:15 PM full text search com indexes invertidos e muito mais rapido do que LIKE
kingless Posted June 27, 2006 at 08:05 PM Report #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
kahoz Posted June 28, 2006 at 11:58 PM Author Report #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.
kingless Posted June 29, 2006 at 10:29 AM Report #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...
M6 Posted June 29, 2006 at 01:17 PM Report #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."
kingless Posted June 29, 2006 at 01:50 PM Report #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...
M6 Posted June 29, 2006 at 05:21 PM Report #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."
kahoz Posted June 29, 2006 at 06:04 PM Author Report #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.
kingless Posted June 29, 2006 at 06:08 PM Report #35519 Posted June 29, 2006 at 06:08 PM Epa... Usa como quiseres já não falo mais nada!
M6 Posted June 30, 2006 at 08:54 AM Report #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."
mAiN_iNfEcTiOn Posted July 12, 2006 at 01:09 PM Report #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'...
Dabubble Posted July 12, 2006 at 01:28 PM Report #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...
mAiN_iNfEcTiOn Posted July 12, 2006 at 07:35 PM Report #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?...
Dabubble Posted July 12, 2006 at 09:39 PM Report #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
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