Foros del Web » Programando para Internet » ASP Clásico »

Buscador de varias palabras 1 registro

Estas en el tema de Buscador de varias palabras 1 registro en el foro de ASP Clásico en Foros del Web. Me gustaría hacer búsquedas por palabras dentro de los registros de una BD access. Actualmente utilizo la siguiente selección: sSQL1 = "SELECT * FROM casas ...
  #1 (permalink)  
Antiguo 11/06/2003, 06:21
 
Fecha de Ingreso: marzo-2003
Mensajes: 21
Antigüedad: 22 años, 1 mes
Puntos: 0
Buscador de varias palabras 1 registro

Me gustaría hacer búsquedas por palabras dentro de los registros de una BD access.
Actualmente utilizo la siguiente selección:
sSQL1 = "SELECT * FROM casas WHERE descripcion LIKE '%"&Request.Querystring("search1")&"%' OR telefono LIKE '%"&Request.Querystring("search1")&"%' OR tipo LIKE '%"&Request.Querystring("search1")&"%' OR modo LIKE '%"&Request.Querystring("search1")&"%' OR precio LIKE '%"&Request.Querystring("search1")&"%' OR agente LIKE '%"&Request.Querystring("search1")&"%' ORDER BY ref"
Pero esto no me vale ya que lo que yo quiero es que el formulario recoja varias palabras desordenadas en un sólo input de texto y que me devuelva aquellos registros que contengan dichas palablas, aunque no lleven el mismo orden.

Gracias.
  #2 (permalink)  
Antiguo 11/06/2003, 07:54
Avatar de maestro  
Fecha de Ingreso: febrero-2002
Ubicación: España
Mensajes: 2.364
Antigüedad: 23 años, 2 meses
Puntos: 1
Deberias recoger las palabras en una variable, hacer un split con ellas y formar un bucle SQL que revise la base de datos tantas veces como palabras tengas.
__________________
Jose Maria Fernandez
[email protected]
Http://www.expansionweb.net
  #3 (permalink)  
Antiguo 11/06/2003, 08:49
 
Fecha de Ingreso: mayo-2003
Ubicación: Montevideo - Uruguay
Mensajes: 37
Antigüedad: 21 años, 11 meses
Puntos: 0
Recoger las palabras en una variable, luego contar la cantida de palabras que tienes, y ahi estoy en desacuerdo con hacer un bucle SQL ya que no es necesario recargar el servidor haciendo n consultas. (Con todo respeto, esta muy mallllllllll hacer esooooooo).

En vez de ello tienes que armar una cadena SQL, y para cada palabra utilizar el like con OR anidados

Saludos
nICO
  #4 (permalink)  
Antiguo 11/06/2003, 09:08
Avatar de maestro  
Fecha de Ingreso: febrero-2002
Ubicación: España
Mensajes: 2.364
Antigüedad: 23 años, 2 meses
Puntos: 1
nicolasd el problema esta en que no sabemos cuantas palabras va a introducir en el textbox y por tanto no podemos hacer una SQL dinamica con un numero indeterminado de AND u OR sin saber el numero fijo de elementos.

De todas formas el 90% de las busquedas se basan en 2 o 3 palabras no creo que suponoga tanta sobrecarga recorrer 3 veces el recordset.
Ademas puede usar getrows y almacenar los valores en una matriz, entonces puede recorrer los valores sin penalizacion sobre el servidor por consultas a la base de datos.
__________________
Jose Maria Fernandez
[email protected]
Http://www.expansionweb.net
  #5 (permalink)  
Antiguo 11/06/2003, 10:08
 
Fecha de Ingreso: mayo-2003
Ubicación: Montevideo - Uruguay
Mensajes: 37
Antigüedad: 21 años, 11 meses
Puntos: 0
Si se puede, utilizando como tu dijistes la funcion split, y guardando en un array las palabras puedes concatenar el string de sql, y hacer la consulta dinamica de acuerdo a lo que ingresa el usuario

Respecto a la sobrecarga, todo depende de la cantidad de la registros que tengas, encima si haces n consulta por plabras duplicas la recarga por cada palabra. Yo prefiero prevenir que luego tratar de arreglar tema performance por haber escrito mal el codigo.

Saludos
nICO

Última edición por nicolasd; 11/06/2003 a las 10:11
  #6 (permalink)  
Antiguo 11/06/2003, 15:28
 
Fecha de Ingreso: marzo-2003
Mensajes: 21
Antigüedad: 22 años, 1 mes
Puntos: 0
Cómo cuento los elementos del split?. Para hacer un bucle deberé de decirle hasta cuando debe repetirse. Si fijo un número de repeticiones constante, si se introducen menos elementos en el input me da eror.
  #7 (permalink)  
Antiguo 11/06/2003, 15:39
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 24 años, 2 meses
Puntos: 535
la cantidad de elementos en un array está dada por UBound(Array) (más 1, recordá que comienza a contar desde el cero)
__________________
...___...
  #8 (permalink)  
Antiguo 13/06/2003, 11:39
 
Fecha de Ingreso: mayo-2003
Ubicación: Montevideo - Uruguay
Mensajes: 37
Antigüedad: 21 años, 11 meses
Puntos: 0
Aqui te adjunto el codgo para que obtengas las palabras del string que pasado por el formulario.

La demas clasula de la consulta SQL va antes lo que tu armas
aqui es otro string el cual va concatenado a la Clausula WHERE


'-1=Retorna todos los sbstrings -1 -- 1=Realiza una comparcion textual
' " " Separador de palabras

Arraypalabra = Split(pstrconsulta, " ", -1, 1)

'largo array
CantidadPalabras=UBound(Arraypalabra, 1)
i=0
strSQLBusqueda=""

while i <= CantidadPalabras

palabra=ArrayPalabra(i)
'DEBUG Response.write "<p class=""blanco"">" & palabra & "(" & i & ")</p><br>"
'para la primer palabra no va el OR

if (i=0) then
strSQLBusqueda= strSQLBusqueda _
& " AU_MATERIAL.PALABRAS_CLAVE Like '%" & palabra & "%'" _
& " OR AU_MATERIAL.DESCRIPCION Like '%" & palabra & "%'" _
& " OR AU_FORMATO_MATERIAL.DESCRIPCION Like '%" & palabra & "%'"
else
strSQLBusqueda= strSQLBusqueda _
& " OR AU_MATERIAL.PALABRAS_CLAVE Like '%" & palabra & "%'" _
& " OR AU_MATERIAL.DESCRIPCION Like '%" & palabra & "%'" _
& " OR AU_FORMATO_MATERIAL.DESCRIPCION Like '%" & palabra & "%'"
end if

i=i+1
Wend

Saludos
nICO
  #9 (permalink)  
Antiguo 14/06/2003, 06:24
 
Fecha de Ingreso: marzo-2003
Mensajes: 21
Antigüedad: 22 años, 1 mes
Puntos: 0
nicolasd esto es lo que tengo hecho hasta ahora:

Set Conn = Server.CreateObject ("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("cgi-bin\empresas\contenidos.mdb")
if request.form("frase")<>"" then
I = 0
frase=request.form("frase")
frasem=Split(frase," ")
For Each Valor In frasem
Redim Preserve palabras(I)
palabras(I) = Valor
I = I + 1
Next
num=ubound(frasem)+1
if num=1 then
sSQL ="SELECT * FROM tabla WHERE palac LIKE '%"&palabras(0)&"%' ORDER BY -ref"
else
if num=2 then
sSQL ="SELECT * FROM tabla WHERE palac LIKE '%"&palabras(0)&"%' AND palac LIKE '%"&palabras(1)&"%' ORDER BY -ref"
else

Funciona, pero mal. En la base de datos en el campo palac las palabras las tengo separadas por espacios. Para la inclusión de una sóla palabra y en algunos casos necesito incluir espacio después de la misma en el formulario para que me la encuentre.
He probado a quitar los espacios entre palabras dentro de la BD pero no me encuentra nada. No sé cómo está funcionando cuando son dos palabras. Algo debe de fallar en la forma de presentar la selección.

Voy a probar lo que me has mandado. De momento es mejor tu planteamiento ya que no existe límite de palabras a incluir.
Saludos.
  #10 (permalink)  
Antiguo 14/06/2003, 09:43
 
Fecha de Ingreso: mayo-2003
Ubicación: Montevideo - Uruguay
Mensajes: 37
Antigüedad: 21 años, 11 meses
Puntos: 0
prueba de cambiar la condicion del where en la linea if num=2 then ... Ya que esta usando un AND cambialo por un OR asi obtendras mayores resultados en la busqueda.

Saludos
nICO
  #11 (permalink)  
Antiguo 15/06/2003, 06:05
 
Fecha de Ingreso: marzo-2003
Mensajes: 21
Antigüedad: 22 años, 1 mes
Puntos: 0
Funciona perfectamente.

Gracias.

La única pega es que importa el orden de inclusión de las palabras. No es lo mismo "tierra redonda" que "redonda tierra" y según sea así lo toma, con el mismo orden en el registro correspondiente.



Rectifico. No funciona.

En primer lugar y no sé por qué, la selección no me coge la primera palabra de cada campo de la BD. P.ej. si en un campo tengo "tierra redonda" (por este oreden y "tierra" la primera palabra) al hacer la búsqueda con la palabra "tierra" no me encuentra nada, al hacer la búsqueda con "tierra redonda" y con "redonda" me devuelve los mismos resultados, los que lleven en el campo "redonda".

Otra cosa que querría evitar es que si introduzco las palabras "tierra redonda", me devuelva todos los registros que tengan "tierra" por un lado y "redonda" por otro. Es un problema ya que según me mandaste el script nicolasd, es verdad que puedo mirar en varios campos con OR y encuentro más registros, pero en cada campo querría que las palabras fuesen con AND, y según está pensado no se me ocurre cómo hacer que sean OR los diferentes campos y AND dentro de un mismo campo.

Saludos.

De todas formas había modificado algo tu script, ya que me daba error de sintaxis. Utilizando esto que sigue es como me da error, que es tal cual me lo mandaste:

if request.form("frase")<>"" then

Set Conn = Server.CreateObject ("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("cgi-bin\empresas\contenidos.mdb")

frase=request.form("frase")
Arraypalabra = Split(frase," ",-1,1)

CantidadPalabras=UBound(Arraypalabra, 1)
i=0

sSQL="SELECT * FROM tabla WHERE"

while i <= CantidadPalabras

palabra=ArrayPalabra(i)
Response.write "<p class=""blanco"">" & palabra & "(" & i & ")</p><br>"

if (i=0) then
sSQL= sSQL & "palac Like '%" & palabra & "%'"
sSQL= sSQL & "OR activ Like '%" & palabra & "%'"
sSQL= sSQL & "OR descrip Like '%" & palabra & "%'"
else
sSQL= sSQL & "OR palac Like '%" & palabra & "%'"
sSQL= sSQL & "OR activ Like '%" & palabra & "%'"
sSQL= sSQL & "OR descrip Like '%" & palabra & "%'"
end if

i=i+1
Wend

Última edición por monra; 15/06/2003 a las 05:53
  #12 (permalink)  
Antiguo 15/06/2003, 08:36
 
Fecha de Ingreso: mayo-2003
Ubicación: Montevideo - Uruguay
Mensajes: 37
Antigüedad: 21 años, 11 meses
Puntos: 0
me parece que el error esta aqui:
sSQL="SELECT * FROM tabla WHERE"

asi que agrega un espacio luego del where
sSQL="SELECT * FROM tabla WHERE "

Otra cosa, esta linea si quieres la puedes sacar yo la utilize para depurar nada mas.

Response.write "<p class=""blanco"">" & palabra & "(" & i & ")</p><br>"

Suerte
saludos
nICO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:30.