Foros del Web » Programando para Internet » PHP »

El registro más relacionado

Estas en el tema de El registro más relacionado en el foro de PHP en Foros del Web. Supongamos que busco el registro que más coincidencias tiene con un texto. Por ejemplo, tenemos: "EL NOMBRE DE LA ROSA" y tenemos los registros en ...
  #1 (permalink)  
Antiguo 05/04/2009, 12:01
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 16 años
Puntos: 1
El registro más relacionado

Supongamos que busco el registro que más coincidencias tiene con un texto. Por ejemplo, tenemos:

"EL NOMBRE DE LA ROSA"

y tenemos los registros en la base de datos:

"LA PANTERA ROSA" -> 2 coincidencias

"EL OJETE INCANDESCENTE" -> 1 coincidencia

"EN BUSCA DEL ARCA PERDIDA" -> 1 coincidencias

"LOS SIN NOMBRE" -> 1 coincidencia

"SIN EL NOMBRE PERO ROSA" -> 3 coincidencias

"EL AGUJERO Y EL ABISMO" -> 1 coincidencia (no se acumulan las mismas coincidencias)

Y evidéntemente quiero que la consulta me devuelva "SIN EL NOMBRE PERO ROSA" que es el que más coincidencias tiene, en este caso 3.

¿Cómo se conseguiria algo así con PHP + MySQL?

gracias
  #2 (permalink)  
Antiguo 05/04/2009, 12:12
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 9 meses
Puntos: 836
Respuesta: El registro más relacionado

Puedes hacer una búsqueda FULLTEXT.

Aquí información detallada al respecto:
http://dev.mysql.com/doc/refman/5.0/...xt-search.html
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 05/04/2009, 12:22
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 16 años
Puntos: 1
Respuesta: El registro más relacionado

ah gracias me ha sido útil.

Ya conocía la función MATCH(), de hecho es la que siempre he utilizado para buscar relaciones, pero me faltaba el tema de ordenar por relevancia y tomar así el registro más relevante (añadiendo un "WHERE MATCH").

Lo malo de MATCH() es el tema de los caracteres mínimos, 4.

¿Alguna forma de superar dicho obstáculo?

P.D. leo linkando por la web que me has pasado que existe la instrucción "ft_min_word_len" para asignar el mínimo de caracteres a indexar en las búsquedas.

¿Eso se implementa desde PHP o directamente en la base de datos con por ejemplo MySQL Admin?

Última edición por dblanco; 05/04/2009 a las 12:28
  #4 (permalink)  
Antiguo 05/04/2009, 12:27
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 9 meses
Puntos: 836
Respuesta: El registro más relacionado

Se puede cambiar en los archivos de configuración, como se indica aquí (también se explica riesgos/beneficios de tales cambios):
http://dev.mysql.com/doc/refman/5.0/...ne-tuning.html
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 05/04/2009, 12:27
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 11 años, 7 meses
Puntos: 416
Respuesta: El registro más relacionado

Es que MATCH toma los caracteres menores de X cantidad de caracteres como COMUNES, y no los incluye en la busqueda, al igual que si una palabra aparece mas del 50% en los registros, este la toma como comun tambien.

Creo que una busqueda FULLTEXT es la mejor opcion, sino habra MUCHISIMAS combinaciones que probar usando un LIKE.

EDIT: Uhhh, no conocia eso David. :) *viendo*
  #6 (permalink)  
Antiguo 05/04/2009, 12:36
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 16 años
Puntos: 1
Respuesta: El registro más relacionado

Cita:
Iniciado por David el Grande Ver Mensaje
Se puede cambiar en los archivos de configuración, como se indica aquí (también se explica riesgos/beneficios de tales cambios):
http://dev.mysql.com/doc/refman/5.0/...ne-tuning.html
si, esa es la página que consulté, pero yo sólo dispongo de servidor compartido y no puedo toquetear ficheros MySQL, sólo dispongo de mi programación PHP o un acceso remoto a MySQL con MySQL admin.

¿Cómo, con mis herramientas disponibles, asigno a la bbdd la directiva "ft_min_word_len=2", por ejemplo?

gracias
  #7 (permalink)  
Antiguo 05/04/2009, 12:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 8 meses
Puntos: 2135
Respuesta: El registro más relacionado

Lamentablemente es una directiva que solo se puede cambiar en el my.cnf, por lo que no vas a poder alterarla usando una consulta, lee lo siguiente:

http://bugs.mysql.com/bug.php?id=845

Saludos.
  #8 (permalink)  
Antiguo 05/04/2009, 12:45
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 16 años
Puntos: 1
Respuesta: El registro más relacionado

Desde luego más claro el agua:

"Full-text variables cannot be changed dynamically. You must set them at server startup time."


Vale, entonces ya que estamos en el foro PHP. ¿Pensáis que se podría hacer una rutina sin sobrecargar demasiado el sistama, teniendo en cuenta que hablamos de una base de datos de unos 30.000 registros?

Porque así a priori sólo se me ocurre ir haciendo selects consecutivos sobre registros y me da que puede ser bastante "heavy" para el servidor.
  #9 (permalink)  
Antiguo 05/04/2009, 13:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 8 meses
Puntos: 2135
Respuesta: El registro más relacionado

Pues es posible hacer algo, sí, tienes que hacer me supongo un algoritmo usando strtok por ejemplo para separar por palabras una frase, luego ir comparando palabra por palabra con la lista e ir almacenando las coincidencias.

Lamentablemente al PHP ser un lenguaje interpretado no creo que sea lo más optimo, pero es tu unica solución.

Saludos.
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 09:49.