Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

crear tabla para buscador

Estas en el tema de crear tabla para buscador en el foro de Mysql en Foros del Web. hola a todos, estuve viendo que hay una forma de hacer tablas tales que cuando ejecutamos el script de un buscador esta te permite buscar ...
  #1 (permalink)  
Antiguo 01/09/2006, 10:46
Avatar de decano  
Fecha de Ingreso: diciembre-2005
Ubicación: Montevideo, Uruguay
Mensajes: 146
Antigüedad: 18 años, 11 meses
Puntos: 0
crear tabla para buscador

hola a todos, estuve viendo que hay una forma de hacer tablas tales que cuando ejecutamos el script de un buscador esta te permite buscar en los campos con grandes cantidades de texto, el tema mio es que no entiendo como hacer la tabla para que funcione con fulltext, asi cuando haga la consulta con las funciones de sql se pueda hacer una busqueda mejor, no se sime explique bien, mi tabla ya esta echa y es asi

Código PHP:
CREATE TABLE `anuncios` (
  `
titulovarchar(45NOT NULL default '',
  `
mensajetext NOT NULL,
  `
fechadate NOT NULL default '0000-00-00',
  `
fecha2varchar(45NOT NULL default '',
  `
nombrevarchar(45NOT NULL default '',
  `
idint(11NOT NULL auto_increment,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM 
ahora como la modifico para lo que suscribi arriba o en una tabla nueva si es necesario
saludos
  #2 (permalink)  
Antiguo 02/09/2006, 13:06
 
Fecha de Ingreso: agosto-2006
Mensajes: 121
Antigüedad: 18 años, 3 meses
Puntos: 0
Tienes que añadir al menos un índice a la tabla del tipo fulltext. En éste pueden formar parte campos de tipo 'cadena' (char, varchar, text). En tu caso, podrías poner uno con titulo y mensaje así:

ALTER TABLE `anuncios` ADD FULLTEXT (
`titulo` ,
`mensaje`
)

Luego, para hacer búsquedas fulltext tienes que usar algo como esto:

SELECT * FROM anuncios WHERE MATCH (titulo, mensaje) AGAINST ('texto a buscar');

Lo que hace esto es buscar con la condición de que se obtenga un cierta puntuación dada una fila de la tabla, con lo que una puntuación igual a cero no aparecerá como resultado. Es posible, por tanto, obtener esta puntuación de resultados, para conocer la relevancia de las coincidencias (buscando por 'Base de datos MySQL' no es tan revante algo como 'La base de datos Oracle...' com 'MySQL es el motor de base de datos más rápido...'). Para conseguirlo se puede añadir la sintaxis anterior a la cláusulala cláusula select:

SELECT *, MATCH (titulo, mensaje) AGAINST ('texto a buscar'); FROM anuncios WHERE MATCH (titulo, mensaje) AGAINST ('texto a buscar');

Esto añade un campo a la consulta que muestra la puntuación de los resultados. Entonces no es mala idea rematarlo con un ORDER BY descendente, para que aparezcan primero los más relevantes:

SELECT *, MATCH (titulo, mensaje) AGAINST ('texto a buscar') FROM anuncios WHERE MATCH (titulo, mensaje) AGAINST ('texto a buscar') ORDER BY MATCH (titulo, mensaje) AGAINST ('texto a buscar');

Usando un alias para esta sintaxis un tanto copiosa nos queda esto:

SELECT *, MATCH (titulo, mensaje) AGAINST ('texto a buscar') as Puntos FROM anuncios WHERE MATCH (titulo, mensaje) AGAINST ('texto a buscar') ORDER BY Puntos
  #3 (permalink)  
Antiguo 03/09/2006, 11:35
Avatar de decano  
Fecha de Ingreso: diciembre-2005
Ubicación: Montevideo, Uruguay
Mensajes: 146
Antigüedad: 18 años, 11 meses
Puntos: 0
Hola amigo y muchas gracias por tu aporte, ahora solo queda que llame a ese alias para al hacer un while me aparezacan todos los resultados?
gracias y saludos
  #4 (permalink)  
Antiguo 04/09/2006, 12:27
 
Fecha de Ingreso: agosto-2006
Mensajes: 121
Antigüedad: 18 años, 3 meses
Puntos: 0
Sí, deberías usar un bucle para obtener las filas de la consulta, aunque no sé si te interesa usar el alias que aparece en el select, puesto que su cometido es más bien su uso en el ORDER BY final. Al respecto debo decir que olvidé ponerle el DESC en el ejemplo. Quiero decir que te indicaba que lo idóneo era una ordenación descendente para obtener primero los más afines a la búsqueda, pero en el jemplo me olvidé de ponerlo. La cosa quedaría así:

SELECT *, MATCH (titulo, mensaje) AGAINST ('texto a buscar') as Puntos FROM anuncios WHERE MATCH (titulo, mensaje) AGAINST ('texto a buscar') ORDER BY Puntos DESC

Luego se trata de recorrer la lista de resultados. Tal y como está montada la consulta tienes acceso a cualquier campo (debido al * (si sólo te interesan unos pocos campos es mejor no usar el * debido a la eficiencia)) y a su puntuación, aunque ya te digo que la puntuación (dentro del select) está más que nada para hacer luego el ORDER BY.

Saludos.
  #5 (permalink)  
Antiguo 08/09/2006, 08:02
Avatar de decano  
Fecha de Ingreso: diciembre-2005
Ubicación: Montevideo, Uruguay
Mensajes: 146
Antigüedad: 18 años, 11 meses
Puntos: 0
hola y gracias por tu respuesta ahora me urge una pregunta si quiero hacer que la consulta se ordene alfabeticamnete por orden de letra devuelta por la consulta, no se si me explico,
gracias
  #6 (permalink)  
Antiguo 12/09/2006, 12:01
 
Fecha de Ingreso: agosto-2006
Mensajes: 121
Antigüedad: 18 años, 3 meses
Puntos: 0
No sé si te entiendo bien del todo. Si lo que quieres hacer es ordenar los rsultados según cierto campo, deberías quitar el ORDER BY Puntos DESC y poner ORDER BY <NombreCampo>. Si <NombreCampo> es alfabético la ordenación se hará alfabéticamente.

Aunque no sé si con eso de letra devuelta por la consulta te refieres a esto ¿...?
  #7 (permalink)  
Antiguo 12/09/2006, 12:23
Avatar de decano  
Fecha de Ingreso: diciembre-2005
Ubicación: Montevideo, Uruguay
Mensajes: 146
Antigüedad: 18 años, 11 meses
Puntos: 0
claro, me explique mal, quiero que devuelva la consulta por orden alfabetico del nombre de campo texto, osea que cuando se haga la busqueda en el text area el resultado sea ordenado ascendente, tu me dices que quite el orde by puntos desc y lo remplace por orde by campo del texte area en la db
es eso no?
gracias
  #8 (permalink)  
Antiguo 12/09/2006, 14:29
 
Fecha de Ingreso: agosto-2006
Mensajes: 121
Antigüedad: 18 años, 3 meses
Puntos: 0
Pues sí, suponiendo que el campo de la tabla donde guardas los textarea se llama 'contenido' simplemente tendrías que hacer ORDER BY contenido. Esto ordenaría ascendentemente según este campo (no es necesario poner ASC explícitamente).
  #9 (permalink)  
Antiguo 12/09/2006, 14:45
Avatar de decano  
Fecha de Ingreso: diciembre-2005
Ubicación: Montevideo, Uruguay
Mensajes: 146
Antigüedad: 18 años, 11 meses
Puntos: 0
no precisamente, el campo se llama texto, ya le hice un indexacion para provocar la busqueda fultext, solo tendria que cambiar la busqueda y poner el nombre texto? estoy en lo cierto no
saludos
  #10 (permalink)  
Antiguo 13/09/2006, 14:07
 
Fecha de Ingreso: agosto-2006
Mensajes: 121
Antigüedad: 18 años, 3 meses
Puntos: 0
Sí, sería ORDER BY texto

un saludo
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 13:42.