Ir para conteúdo

POWERED BY:

Arquivado

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

webfuture

sobre sistema de busca

Recommended Posts

Galera, há um tempo atras navegando no site do Imasters na área de códigos, encontrei um script de busca com opções de paginação Primeira Anterior 1 2 3 4 5 6 7 Próxima Última, esta funcionando perfeito, porém, conforme o número de registros esta aumentando esta se tornando mais lento, gostaria de saber se este script não se encaixaria no que eu preciso, se pode ser melhorado ou o que vcs me sugerem ? A base atual que estou trabalhando tem em média 800.000 registros...

 

Olhem o script:

 

Set conexaoSQL = Server.CreateObject("AdoDb.Connection")						ConexaoSQL.Open "Provider=SQLOLEDB.1;SERVER=MATRIX;" &_						"DATABASE=TESTE;UID=sa;PWD=;"						PaginaAtual = Request("PagAtual")						if PaginaAtual = "" then							PaginaAtual = "1"						End If						Session("busca") = trim(request("search"))						varbusca = Session("busca")						aba = Request("a")							arr= split(varbusca,",")'							for x = 0 to ubound(arr)							if x =0 then							varsql = " (campo1) like '%" & (arr(x)) & "%' or (campo2) like '%" & (arr(x)) & "%' or (campo3) like '%" & (arr(x)) & "%' or (campo4) like '%" & (arr(x)) & "%'"							else							varsql = varsql & "or (campo1) like '%" & (arr(x)) & "%' or (campo2) like '%" & (arr(x)) & "%' or (campo3) like '%" & (arr(x)) & "%' or (campo4) like '%" & (arr(x)) & "%' "							end if							next							Set RSContaSites = Server.CreateObject("AdoDB.Recordset")							SQL = "SELECT count(*) as total from TBlREgistros WHERE ("& varsql &") "							RSContaSites.open SQL, conexaoSQL							if not(RSContaSites.eof) then								total = RSContaSites.fields("total")							end if							RSContaSites.Close							Set RSContaSites = Nothing							SQL = "select campo1, campo2, campo3, campo4 from TblREgistros WHERE ("& varsql &") "PagAtual = Request.QueryString("PagAtual") 'página atual													Set RS= Server.CreateObject("ADODB.Recordset") 'acrescentei por causa da paginação													RS.Open SQL, conexaoSQL, 3													if rs.eof then														encontrados = false													else														encontrados = true													end if													Const NumPorPage = 25													Dim PagAtual													IF Request.QueryString("PagAtual") = "" Then														  PagAtual = 1													Else														  PagAtual = Request.QueryString("PagAtual")													End If													RS.CacheSize = NumPorPage													if encontrados <> false then													RS.MoveFirst													end if													RS.PageSize = NumPorPage													Dim TotalPages													TotalPages = RS.PageCount													if encontrados <> false then													RS.AbsolutePage = PagAtual													end if													Count = 0													i = 0													Function QuebraTexto(Texto, Caracteres)													If Len(Texto) => Eval(Caracteres) Then													QuebraTexto = Left(Texto, Caracteres) &"<BR>"& QuebraTexto(Right(Texto,Len(Texto)-Caracteres), Caracteres)													Else													QuebraTexto = Texto													End If													End Function													DO WHILE NOT RS.EOF And Count < RS.PageSize  'paginacao And Count < RS.PageSize																										campo1 = RS("campo1")													campo2 = RS("campo2")													campo3 = RS("campo3")													campo4 = RS("campo4")													campo5 = RS("campo5")													%>													resultados do banco de dados													<%													End If														i = i+1													 Count = Count + 1														RS.MoveNext														LOOP													if encontrados <> false then													Response.Write("<br><br><br><center>")													 Response.Write("<B><font color=""#000000""><strong> Página " & PagAtual & " de " & TotalPages & " </strong></font></B> - ")													var01 = Len(PagAtual) 'Lê o tamanho do numero													var02 = var01 - 1 'subtrai um da variavel , retirando o digito menos sig.													var03 = Left(PagAtual,var02) 'obtem os digitos mais  sig. do numero													var04 = Right(PagAtual,1)	'obtem o digito menos sig. do numero													var05 = var03 & 0 ' Acrecenta ZERO no final													IF var04 <> 0 THEN	 ' condição se o digito menos sig. é Zero													inicial = var05 + 1													final = inicial + 9													ELSE													inicial = var05 - 9													final = var05													END IF													indice_i = var04 - 1 'ultimo digito  - 1													indice_f = 10 - var04 ' 10 - digito menos sig.													' If CInt(inicial) < 1 Then inicial = 1													If CInt(final) > CInt(TotalPages) Then final = TotalPages													'------------------------------------------------------------------------------													IF PagAtual > 1 THEN													'Se for a primeira página, Mostra apenas o botão Próximo e Ultima														  Response.Write("<B><font color=""#000000"">")														  Response.Write("<a class='AZUL snap_nopreview' href='search.asp?search="& varbusca &"&a="&aba&"&o="&o&"&PagAtual=" &  1 & "'>")														  Response.Write("« Primeira")														  Response.Write("</a></font></B>  ")														  Response.Write("<B><font color=""#000000"">")														  Response.Write("<a class='AZUL snap_nopreview' href='search.asp?search="& varbusca &"&a="&aba&"&o="&o&"&PagAtual=" & PagAtual - 1 & "'>")														  Response.Write("« Anterior")														  Response.Write("</a></font></B>  ")														  IF PagAtual > 10 THEN														   Response.Write("<B><font color=""#000000"">")														   Response.Write("<a class='snap_nopreview' href='search.asp?search="& varbusca &"&PagAtual=" & inicial - 1 & "&a="&aba&"&o="&o&"'>")														   Response.Write("...")														 Response.Write("</a></font></B>  ")															  ELSE														  Response.Write("<B><font color=""#CCCCCC"" size=""2"" face=""Arial"">")														   Response.Write("....")														   Response.Write("</font></B>  ")														END IF													  Else														  Response.Write("<B><font color=""#EEEEEE"">")														  Response.Write("« Primeira")														  Response.Write("</font></B>  ")														  Response.Write("<B><font color=""#CCCCCC"">")														  Response.Write("« Anterior")														  Response.Write("</font></B>  ")														  Response.Write("<B><font color=""#CCCCCC"">")														  Response.Write("...")														  Response.Write("</font></B>  ")													End If													'---------------------- NUMEROS  ---------------------------													For i = inicial To final														 If CInt(i)=CInt(PagAtual) Then															 Response.Write "<font color=""#000000"" >[ <B>" & i & "</B> <font color=""#000000"">]</font>  "														 END IF														 If CInt(i) < CInt(PagAtual) Then														  Response.Write "<font color=""#000000""><a class='AZUL snap_nopreview' href='search.asp?search="& varbusca &"&a="&aba&"&o="&o&"&PagAtual=" & i & "'>" & i & "</a></font>  "														 END IF														 If CInt(i) > CInt(PagAtual) Then															 Response.Write "<font color=""#000000""><a class='AZUL snap_nopreview' href='search.asp?search="& varbusca &"&a="&aba&"&o="&o&"&PagAtual=" & i & "'>" & i & "</a></font>  "													  END IF													Next													'------------------------------------------------------													IF CInt(PagAtual) <> CInt(TotalPages) THEN													p1 = Left(PagAtual,var02)													p2 = Left(TotalPages,var02)													p3 = Left(TotalPages,var02) & 0													'##### CONDIÇÕES ########													'digitos mais significativos do Numero com 1 no fim > PagAtual EX:  21   [ 22 ]  23   24  25		 2 com 1 => 21 > 22 (F)													'OU													'PagAtual <= 10	  E	TotalPages > 10													'EX:  ... 1  2  3  4 [ 5 ]  6  ...			  5 <= 10 (V)  E   6 > 10 (F)													IF (p1 > PagAtual) or ((PagAtual <= 10) and (TotalPages > 10)) THEN														   Response.Write("<B><font color=""#000000"">")														   'Response.Write("<a class='AZUL snap_nopreview' href='search.asp?search="& varbusca &"&a="&aba&"&o="&o&"&PagAtual=" & final + 1 & "'>")														   Response.Write("...")														   'Response.Write("</a></font></B>  ")															 ELSE														   Response.Write("<B><font color=""#CCCCCC"" size=""2"" face=""Arial"">")														   Response.Write("...")														   Response.Write("</font></B>  ")													   END IF														  Response.Write("<B><font color=""#000000"">")														  Response.Write("<a class='AZUL snap_nopreview' href='search.asp?search="& varbusca &"&a="&aba&"&o="&o&"&PagAtual=" & PagAtual + 1 & "'>")														  Response.Write("Próxima »")														  Response.Write("</a></font></B>  ")														  Response.Write("<B><font color=""#000000"">")														  Response.Write("<a class='AZUL snap_nopreview' href='search.asp?search="& varbusca &"&a="&aba&"&o="&o&"&PagAtual=" & TotalPages & "'>")														  Response.Write("Ultima »")														  Response.Write("</a></font></B>  ")													 ELSE														  Response.Write("<B><font color=""#CCCCCC"" size=""2"" face=""Arial"">")														  Response.Write("...")														  Response.Write("</font></B>  ")														  Response.Write("<B><font color=""#CCCCCC"">")														  Response.Write("Próxima »")														  Response.Write("</font></B>  ")														  Response.Write("<B><font color=""#EEEEEE"">")														  Response.Write("Ultima »")														  Response.Write("</font></B>  ")													End If													'################## fim paginacao 02 #######################													Rs.Close													Set RS = Nothing													ConexaoSQL.Close													Set ConexaoSQL = Nothing													Response.Write("<br><br></center>")													end if

WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá hargon vou dar uma testada neste script para ver no que dá, porque este que peguei aqui e dei uma modificada esta ficando demorado e ai não da para usar. Porque a base vai ter no minimo 500.000 registros e pode ir até 2.000.000 de registros.WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal, dei uma olhada no código de paginação com GetRows e estou começando a mexer nele para me familiarizar, porém, já estou com dúvidas..rs vejam o código:

 

<%Set conexaoSQL = Server.CreateObject("AdoDb.Connection")ConexaoSQL.Open "Provider=SQLOLEDB.1;SERVER=SERVIDOR;" &_"DATABASE=teste;UID=sa;PWD=;"pagina = request("pagina")if pagina = "" thenpagina = 1elsepagina = cint(pagina)end ifSQL="SELECT campo1, campo2, campo3, campo4 FROM tabela"SET RS = Server.CreateObject("Adodb.recordset")RS.Open SQL,ConexaoSQL,3,3if not rs.eof thennomes = rs.getrows()end ifrs.closeset rs = nothingtotal = ubound(nomes,2)registros = 10paginas = total / 10if cint(paginas) * registros < total thenpaginas = cint(paginas) + 1end ifif pagina = 1 theninicio = 0elseinicio = cint(registros) * (pagina) - 10end iffim = cint(inicio) + 9if cint(fim) > cint(total) thenfim = cint(total)end if%><%FOR I=inicio TO fimresponse.write nomes(2,i) & "<BR>" & nomes(3,i) & "<br><BR>"next%><%FOR I = 1 TO cint(paginas)if cint(pagina) = i thenmostra = "[" & i & "]"elsemostra = iend ifresponse.write "<a href=teste.asp?pagina=" & I & ">" & mostra & "</a> "next%>

Se eu quero mostrar um dado que esta na quarta coluna da tabela não seria:

 

<%Response.Write nomes(3,i)%>

 

Aqui esta dando o erro:

 

Subscrito fora do intervalo: '[number: 3]'

 

Pelo menos foi isto que entendi ao trabalhar com os campos da tabela.

 

WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria o contrário não... (linha,coluna) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá hargon, ja havia tentado do jeito que você falou mas também da erro:Subscrito fora do intervalo: 'I'Acredito que seja algo simples mas não to achando,WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal, consegui, na verdade estava comendo bola, pois de acordo com o select somente ia de 0,i a 2,i e não até 3,i, então agora esta funcionando perfeito.Agora o que eu penso em fazer: Pegar o script de paginação normal e adaptar ele para se trabalhar com GetRows, não sei se esta é a melhor forma de se fazer, mas é um teste que pensei em fazer, sera que é uma boa ? Porque penso em deixar o sistema trabalhando digamos rapido com no minimo 1 milhão de registros...WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém topa fazer uma otimização neste código para que ele trabalhe com cerca de 2.000.000 de registros sem muita demora nas respostas a consultas ? Interessados por favor deixar MSN.WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara dê uma pesquisada sobre StoredProcedures. A execução delas costuma ser mais rápidas que consultas SQL diretas via ADO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém conhece alguma forma de buscar em um banco de dados com cerca de 1.500.000 registros por determinada palavra indiferente de onde se encontre a mesma, por exemplo:Se eu tenho o título: Somente programadores ASP Feras e busco por programadores ASP ele encontre, ou ASP Feras ele encontre, uso atualmente o Like '%"& palavra &"%'" porem numa base muito grande ele demora muito, alguém conhece uma forma de fazer esta busca funcionar sem demorar muito ? Até mesmo com uma stored procedure ele se torna demorado.. digamos que ele demore cerca de 20 segundos...WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que vai ter que criar uma tabela auxiliar com resultado de algumas buscas, +/- como o Google faz. Imagine numa busca simples ele ter que varrer o banco dele que deve ser absurdamente maior que esses 1,5 milhão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Salgado, acho interessante este lance da tabela auxiliar, me tira uma dúvida, nesta tabela que tipo de dados seriam gravados? Existe algo deste tipo aqui no Fórum para que eu possa dar uma olhada ?Outra coisa que ouvi dizer é: ao usuário pesquisar algo, fazer a contagem de registros retornados atraves da busca dele: vamos supor que de 1.500.000 atraves de uma busca por: fórum retornaria 10.000 registros (supondo) dividiria pela quantidade de registros por página e ai faria a paginação em cima disto, não sei se desta forma resolveria também o problema, uma parte disto consegui fazer agora fazer a paginação em cima dos resultados é que não entendi ao certo, não sei como fazer, o que você acha desta ?WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites
Olá Salgado, acho interessante este lance da tabela auxiliar, me tira uma dúvida, nesta tabela que tipo de dados seriam gravados? Existe algo deste tipo aqui no Fórum para que eu possa dar uma olhada ?
Acho qe não tem, mas consiste em fazer uma pesquisa antes nessa tabela auxiliar pelos dados que se quer pesquisar, caso não encontre se faz a busca na tabela principal e grava-se o resultado nessa tabela auxiliar, daí já agiliza a próxima busca.

Outra coisa que ouvi dizer é: ao usuário pesquisar algo, fazer a contagem de registros retornados atraves da busca dele: vamos supor que de 1.500.000 atraves de uma busca por: fórum retornaria 10.000 registros (supondo) dividiria pela quantidade de registros por página e ai faria a paginação em cima disto, não sei se desta forma resolveria também o problema, uma parte disto consegui fazer agora fazer a paginação em cima dos resultados é que não entendi ao certo, não sei como fazer, o que você acha desta ?

 

WebFuture

Como já disseram que um simples count é pesado eu não saberia te dizer se adiantaria algo, isso só na base do teste mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O pior é que no final das contas, em ambos os processos o tempo pode se tornar muito maior do que o esperado, ai que esta o complicado, porque o usuário quando efetua uma busca não quer ficar esperando 10s ou mais pelos resultados.Tá complicado de se resolver esta questão,Você conhece alguém que possa me ajudar, tipo free-la nesta questão?WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém sabe como resolver este problema ? Alguém disposto a fazer um free-la para resolver este lance ? Preciso simplesmente que um sistema trabalhe com uma média máxima de 3.000.000 de registros com um tempo de retorno digamos rapido, não demorar 15 ou 20 segundos pra retorar uma busca.Alguém poderia me ajudar nisto ?WebFuture

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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