Ir para conteúdo

POWERED BY:

Arquivado

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

marvi

Como fazer um busca assim?

Recommended Posts

Olá pessoal, tem um sistema de busca em ASP e que tem um SQL assim:

 

SELECT * FROM noticias WHERE titulo LIKE '%"& varbusca &"%' OR texto LIKE '%"& varbusca &"%' ORDER BY alteracao DESC

 

Como faço para ele pegar qualquer coisa e não só palavras certas, tipo:

 

Tem uma matéria assim:

 

Candeias será a sede da realização da II Conferência das Cidades

 

E se digito "Candeias" ele chama essa matéria. Mas, se digito "2º Conferência das cidades de Candeias" ele não encontra nada, por que? Ele poderia considerar alguma coisa dentro da frase "2º Conferência das cidades de Candeias", considerar pelo menos "candeais" e tal e chamar as matérias que tenha a palavra "candeias" no meio ou coisa assim, como o google faz.

 

Como resolver isso?

 

Desde já, agradeço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

dá uma response.write na sua string SQL para ver o k esta sendo passado

SQL="SELECT * FROM noticias WHERE titulo LIKE '%"& varbusca &"%' OR texto LIKE '%"& varbusca &"%' ORDER BY alteracao DESC"

 

response.write(SQL)

response.end()

Compartilhar este post


Link para o post
Compartilhar em outros sites

não encontra porque você gravou II e não 2º.

Pra fazer isso terás que separar por espaço a string de busca e montar o lile usando cada palavra, mas isso vai matar a base se tiverem muitos nesta tabela

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, gerou isso:

 

SELECT * FROM noticias WHERE titulo LIKE '%2º Conferência das cidades de Candeias%' OR texto LIKE '%2º Conferência das cidades de Candeias%' ORDER BY alteracao DESC

 

E qual a solução? Na frase "2º Conferência das cidades de Candeias" ele poderia pegar qualquer palavra, por exemplo: "Candeias" e chamar uma matéria que tenha "Candeias", que provavelmente chamaria a matéria que quero, entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

se eu realmente precisasse fazer uma consulta neste porte, imaginaria 2 soluções de imediato:

 

1-Fazer replace dos caracteres especiais pelo caracter espaço, quebraria a string e montaria o sql com o like para cada palavra

2-Ao cadastrar, gravaria em uma tabela cada palavra que está relacionada ao registro(tipo as Tag Clouds), ja´sem caracteres especiais e tudo em maiuscula. Em outra tabela relacionaria o ID do registro principal com os IDS da tabela de palavras. A consulta não seria mais feita usando like mas sim a igualdade. Quando fosse pesquisar colocaria tudo em Upper da string, removeria os caracteres especiais digitados e faria a busca normal

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz um tratatamento antes com um replace...

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz um tratatamento antes com um replace...

 

Sim, mas como seria esse tratamento com raplace? o que iria tirar? Não entendi... Pois, ele tem que pegar qualquer palavra da frase.

 

variavel=replace("variavel","o que fica aqui?")

Compartilhar este post


Link para o post
Compartilhar em outros sites

caracteres especiais pelo caracter espaço

/teste%teste%arquivo.asp

Compartilhar este post


Link para o post
Compartilhar em outros sites

caracteres especiais pelo caracter espaço

/teste%teste%arquivo.asp

 

Me desculpe, mas não estou entendendo. Se tenho essa pesquisa:

 

varbusca=request("busca")

 

nesse varbusca acima tem o valor: 2º Conferência das cidades de Candeias. Que é o que é mostrado no SQL abaixo:

 

SELECT * FROM noticias WHERE titulo LIKE '%2º Conferência das cidades de Candeias%' OR texto LIKE '%2º Conferência das cidades de Candeias%' ORDER BY alteracao DESC

 

Como seria um trabalho desse na sua concepção?

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca assim

 

SELECT * FROM noticias WHERE titulo LIKE '%"2º Conferência das cidades de Candeias%' OR texto LIKE '%2º Conferência das cidades de Candeias&"%'" ORDER BY alteracao DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca assim

 

SELECT * FROM noticias WHERE titulo LIKE '%"2º Conferência das cidades de Candeias%' OR texto LIKE '%2º Conferência das cidades de Candeias&"%'" ORDER BY alteracao DESC

Para que eu possa aprender poderia me dizer o que modificou na sintaxe?

 

SQL="SELECT * FROM noticias WHERE titulo LIKE '%"& varbusca &"%' OR texto LIKE '%"& varbusca &"%' ORDER BY alteracao DESC"

 

Pois, não vi diferença, não de forma gritante

Compartilhar este post


Link para o post
Compartilhar em outros sites

passando como string varbusca , sendo como string e buscando em todos os caracteres'%"& varbusca &"%'

Compartilhar este post


Link para o post
Compartilhar em outros sites

passando como string varbusca , sendo como string e buscando em todos os caracteres'%"& varbusca &"%'

 

Mas, minha SQL faz isso, veja em negrito:

 

SQL="SELECT * FROM noticias WHERE titulo LIKE '%"& varbusca &"%' OR texto LIKE '%"& varbusca &"%' ORDER BY alteracao DESC"

Compartilhar este post


Link para o post
Compartilhar em outros sites

da um response.write na sua string SQWL para ver o k esta sendo passado

Compartilhar este post


Link para o post
Compartilhar em outros sites

da um response.write na sua string SQWL para ver o k esta sendo passado

 

Eu já fiz, veja:

 

gerou isso:

 

SELECT * FROM noticias WHERE titulo LIKE '%2º Conferência das cidades de Candeias%' OR texto LIKE '%2º Conferência das cidades de Candeias%' ORDER BY alteracao DESC

 

É isso que fala? O 2º Conferência das cidades de Candeias foi o que digitei no busca

Compartilhar este post


Link para o post
Compartilhar em outros sites

existem exemplos onde você pode fazer uma busca usano o E (and) OU (or) palavra EXATA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou olhar, mas tiveram muitas críticas negativas nos comentários da matéria

 

existem exemplos onde você pode fazer uma busca usano o E (and) OU (or) palavra EXATA

 

and ou or ja fiz, mas o problema é pegar uma palavra exata de uma frase

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha este exemplo

 

'------------- SEARCH
'******************************************************
'******************************************************

On Error Resume Next



PAGE_SIZE = 20  ' display number of results


strURL = Request.ServerVariables("URL") ' the URL or Query string



'------------- q = the input text


strSearch = Request.QueryString("q") ' the input text

If strSearch = "" Then

 Server.htmlencode(Trim(Request.Form("q")))

End If


strSearch = Replace(strSearch, "'", "''")


'----------- p = RESULT PAGING

IF isnumeric(Request.QueryString("p")) = True OR Request.QueryString("p") = "" THEN

				  ' Retrieve page to show or default to the first
				  If Request.QueryString("p") = ""  OR Request.QueryString("p") < 1 Then
				  	iPageCurrent = 1
				  Else
				  	iPageCurrent = CInt(Request.QueryString("p"))
			  	  End If

ELSE

iPageCurrent = 1


END IF

p = iPageCurrent



'----------------- t = SELECTED TABLE

IF isnumeric(Request.QueryString("t")) = True OR Request.QueryString("t") = "" THEN

				  ' Retrieve t

				  If Request.QueryString("t") = ""  OR Request.QueryString("t") < 1 Then
				  	searchTable = 1 '1
				  Else

				  	searchTable =  1 'CInt(Request.QueryString("t"))

			  	  End If

ELSE

searchTable = 2 '1

END IF


'------------------- m = SEARCH METHOD

IF isnumeric(Request.QueryString("m")) = True OR Request.QueryString("m") = "" THEN

				  ' Retrieve m
				  If Request.QueryString("m") = ""  OR Request.QueryString("m") < 1 Then
				  	strMethod = 2
				  Else
				  	strMethod = CInt(Request.QueryString("m"))
			  	  End If

ELSE

strMethod = 2


END IF



'---------------THE FORM
%>

                  <form method="get" action="<%= strURL %>">
					<p>
					<input type="radio" name="m" value="1" <% IF strMethod = 1 THEN response.write "checked=""checked""" END IF%> />
                    	E
                    	<input type="radio" name="m" value="2" <% IF strMethod = 2 OR strMethod = "" THEN response.write "checked=""checked""" END IF%> />
                    	OU
                    	<input type="radio" name="m" value="3" <% IF strMethod = 3 THEN response.write "checked=""checked""" END IF%> />
                   	Exato</p>

					<p><input type="text" class="input3" name="q" value="<%= Trim(strSearch) %>" /></p>

                    <p><input type="submit" value="Procura" />
                    <br /><br /></p>

                  </form>
                  <%



If strSearch <> "" Then


		Session("strSearch") = strSearch

		IF isnumeric(Request.QueryString("t")) = True OR Request.QueryString("t") = "" THEN

						  ' Retrieve t

						  If Request.QueryString("t") = ""  OR Request.QueryString("t") < 1 Then
							searchTable = 1 '1
						  Else

							searchTable = 1 'CInt(Request.QueryString("t"))

						  End If

		ELSE

		searchTable = 1' 1

		END IF




		' THE TABLES

		Select Case searchTable

			Case CInt("1")

					dbTable = "tMessages"
					'strDBPath = Server.MapPath("/blogg/blog.mdb")


			Case CInt("2")

					'dbTable = "events"
					'strDBPath = Server.MapPath("")

			Case Else

					dbTable = "tMessages"
					'strDBPath = Server.MapPath("")


		End Select



'------------------ SQL



				  'SPLIT STRING INTO ARRAYS
				  'FOR and AND or CLAUSE SQL


'----------------- SQL tMessages blog table

IF searchTable = "1" THEN
IF strMethod < 3 THEN


			If strMethod = 1 Then
			strSplit = Replace(strSearch," "," and ")
			Else
			strSplit = Replace(strSearch," "," or ")
			End If


			colTerms = split(strSplit," and ",-1,1)

			iUpperTerms = UBound(colTerms)

			strWhereClause = ""



			'FIELD CLAUSES

			nr = 0
			Do while nr <= 5

			nr = nr + 1

			searchField = CInt(nr)

			Select Case searchField

				Case CInt("1")

					strTableInClause = "fDate"

				Case CInt("2")

					strTableInClause = "fHeadline"

				Case CInt("3")

					strTableInClause = "fMessage"

				Case CInt("4")

					strTableInClause = "fAuthor"

				Case CInt("5")

					strTableInClause = "fnota"
				
				'Case Else


			End Select


				  For iLoop = LBound(colTerms) to iUpperTerms
					orTerms = split(colTerms(iLoop)," or ",-1,1)
					iUpperOrTerms = UBound(orTerms)
					strWhereClause = strWhereClause & ""

						for iOrLoop = LBound(orTerms) to iUpperOrTerms
								strWhereClause = strWhereClause & strTableInClause & " LIKE '%" & Trim(orTerms(iOrLoop)) & "%' "

							if iOrLoop < iUpperOrTerms then
								strWhereClause = strWhereClause & " OR "
							end if
						next

						strWhereClause = strWhereClause & ""

						if iLoop < iUpperTerms then
								strWhereClause = strWhereClause & " AND "
						end If

				  Next

				  if nr <= 4 then
				  strWhereClause = strWhereClause & " OR "
				  end if

		Loop


ELSE

' METHOD 3 EXACT PHASE WHERE

strWhereClause = "fDate LIKE '%" & strSearch & "%' OR fHeadline LIKE '%" & strSearch & "%' OR fMessage LIKE '%" & strSearch & "%' OR fAuthor LIKE '%" & strSearch & "%'  OR fnota LIKE '%" & strSearch & "%'"

END IF


strWhereClause2 = "WHERE (" & strWhereClause & ") AND (online = CBool(-1))"

' ORDER BY
strOrderClause = "ORDER BY fdate DESC"



	IF strMethod = 3 THEN

		strSQL = "SELECT * FROM "& dbTable &" "& strWhereClause2 &" "& strOrderClause &";"

	ELSE

		strSQL = "SELECT * FROM "& dbTable &" "& strWhereClause2 &" "& strOrderClause &";"

	END IF


END IF

Response.write strSQL

'---------- END SQL tMessages BLog




'--------- CONNECTION OPEN & EXE SQL


	Set myRecSet = Server.CreateObject("ADODB.Recordset")
	myRecSet.PageSize  = PAGE_SIZE
	myRecSet.CacheSize = PAGE_SIZE

	' constants
	adOpenStatic = 3
	adLockReadOnly = 1
	adCmdText = &H0001


	myRecSet.Open strSQL, sConn, adOpenStatic, adLockReadOnly, adCmdText


	iRecordCount = myRecSet.RecordCount
	iPageCount   = myRecSet.PageCount



			   ' THE RESULT COUNTER

				strCountRecord = iRecordCount

				If iPageCurrent = 1 Then

				  		strCount = strCountRecord - iRecordCount + 1

				Else

						strCount = iPageCurrent * PAGE_SIZE - PAGE_SIZE + 1

						'strCountRecord -  + * iPageCurrent

				End If



	If iRecordCount = 0 Then


		%>			<p>Desculpa, sua busca não retornou resultados.<br />
                    Sua Busca por - <b><%=strSearch%></b> - não retornou documentos.</p>

                  <%
	Else

		myRecSet.AbsolutePage = iPageCurrent

		If iRecordCount <= PAGE_SIZE then
		toRecord = iRecordCount
		else
		toRecord = strCount + PAGE_SIZE - 1
		End if
		If toRecord => iRecordCount then
				toRecord=  iRecordCount
		End if

		%>

                        <p>Mostrando  resultado <%=strCount%> - <%=toRecord%> de <%=iRecordCount %>. Paginas <%= iPageCurrent %> / <%= iPageCount %>. </p>
						<br /><p>
                        <%

		If iPageCurrent > 1 Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= iPageCurrent - 1 %>" title="Previous">
                        ‹‹</a>
                        <%
		End If


		For I = 1 To iPageCount
			If I = iPageCurrent Then

			%>

                        <%= I %>
                        <%
			Else
				%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= I %>" title="<%= I %>"><%= I %></a>
                        <%
			End If
		Next 'I

		If iPageCurrent < iPageCount Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= iPageCurrent + 1 %>" title="Next"> ››</a>
                        <%
		End If
		%></p>

        <%

'----------------THE RESULT LOOP


		Do While Not myRecSet.EOF And myRecSet.AbsolutePage = iPageCurrent


					intNumMatches = 0
					allregText = ""
					regWriteOut = ""

					If strSearch = " " then
						strSearch = ""
					End if

					Set objRegExp = New RegExp
					objRegExp.Global = True
					objRegExp.IgnoreCase = True


					If dbTable = "tMessages" then
					allregText = myRecSet.Fields("fDate").Value & " " & myRecSet.Fields("fHeadline").Value & " " & myRecSet.Fields("fMessage").Value & " " & myRecSet.Fields("fAuthor").Value
					End If


					allregText = Replace(allregText, "<", "", 1, -1, 1)
					allregText = Replace(allregText, ">", "", 1, -1, 1)
					allregText = UTFtoISO(allregText)

					If strMethod = 3 then

					'Set the pattern to search for
					objRegExp.Pattern = strSearch

					'Search the file for the phrase
			 		Set objMatches = objRegExp.Execute(allregText)

					'Get the number of times the phrase is matched
					intNumMatches = objMatches.Count

					End if

					If strMethod < 3 then

					sarySearchWord = Split(strSearch, " ")
					For intSearchLoopCounter = 0 to UBound(sarySearchWord)

					'Set the pattern to search for
					objRegExp.Pattern = "" & sarySearchWord(intSearchLoopCounter) & ""

					'Search the file for the phrase
					Set objMatches = objRegExp.Execute(allregText)

					intNumMatches = intNumMatches + objMatches.Count

					Next
					End if



			 		If intNumMatches => 1 Then

					If intNumMatches > 1 then
					regWriteOut = "" & intNumMatches & " hits."
					Else
					regWriteOut = "" & intNumMatches & " hit."
					End If

			 		End If

					Set objRegExp = Nothing



			%>


					<% IF dbTable = "tMessages" THEN %>
					<p><br /><br />
					<%=strCount%>. <a href="default.asp?id=<%= myRecSet.Fields("id").Value %>" title="<%=myRecSet.Fields("fHeadline").Value%>"><%= myRecSet.Fields("fHeadline").Value %></a>
					<br /><%= RemoveHTML(Left(myRecSet.Fields("fMessage").Value,instrrev(Left(myRecSet.Fields("fMessage").Value,280),"")))%>
					<br />
					Postado: <%= year(myRecSet.Fields("fdate").Value)  & "-" & right("00" & cstr(month(myRecSet.Fields("fdate").Value)),2) & "-" & right("00" & cstr(day(myRecSet.Fields("fdate").Value)),2) & ". " & regWriteOut%>
					</p>
					<% END IF%>


           <%


						strCount = strCount + 1
			myRecSet.MoveNext
		Loop


'----------------THE RESULT LOOP END
		%>
                    	<br /><br /><p>
                        <%

		If iPageCurrent > 1 Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= iPageCurrent - 1 %>" title="Previous">‹‹</a>
                        <%
		End If


		For I = 1 To iPageCount
			If I = iPageCurrent Then
				%>

                        <%= I %>
                        <%
			Else
				%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= I %>" title="<%= I %>"><%= I %></a>
                        <%
			End If
		Next 'I

		If iPageCurrent < iPageCount Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= iPageCurrent + 1 %>" title="Next">››</a>
                        <%
		End If
		%>

                    <%

		End If

%></p>
<%

		' CLOSE & DISPOSE

		myRecSet.Close
		Set myRecSet = Nothing
		End If



'---------------- SEARCH END


'******************************************************
'******************************************************
%>

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.