Ver Mensaje Individual
  #5 (permalink)  
Antiguo 23/06/2010, 01:42
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Fulltext search por varias tablas

xcars tiene razón. Deberías ordenar por relevancia o algo así. Mira aquí.
http://www.databasejournal.com/sqlet...L---Part-1.htm

pero no te olvides de que estás buscando con OR en dos campos de dos tablas distintas. La relevancia en uno de ellos puede ser 0,02601 y en otro muy alta (desconozco el rango y tampoco este es el lugar para explicar la fórmula de la relevancia, aunque la hay); si ordenas por el primer valor de relevancia, te quedará mal unas veces y otras no. Yo lo que haría es ordenar por el valor más alto de relevancia en cualquiera de esos campos, e incluso podráis añadir un segundo criterio de orden (el del otro campo) en caso de empate.

SELECT campo1, campo2 ,MATCH(campo1) AGAINST('Visual Basic Ceballos') relevance1, MATCH(campo2) AGAINST('Visual Basic Ceballos') relevance2, IF(relevance1 >=relevance2, relevance1, relevance2) ORDEN1, IF(relevance1 < relevance2, relevance1, relevance2) ORDEN2
FROM tutabla WHERE MATCH(campo1) AGAINST('Visual Basic Ceballos') OR MATCH(campo2) AGAINST('Visual Basic Ceballos') ORDER BY ORDEN1 DESC, ORDEN2 DESC;

No he probado nada, pero esta es la idea. Haz alguna prueba.

Pongo la fórmula de consulta porque el enlace de donde la saque está cortado http://quarkblog.org/2007/01/14/mysq...-para-humanos/:
Aquí la tienes,la encontré:
Las formulas
Hay tres formulas, y no son para nada complicadas

peso_local = (log(dtf)+1)/sumdtf * U/(1+0.0115*U)
peso_global = log((N-nf)/nf)
peso_consulta = peso_local * peso_global * qf
Parámetros
dtf el número de veces que el término aparece en la fila.
sumdtf el sumatorio de (log(dtf)+1) para todos los términos de la misma fila.
U el número de términos únicos que hay en la fila.
N el número de filas que hay en la tabla.
nf el número de filas que contienen el término.
qf el número de veces que el término aparece en la consulta.
Por último log(n) hace referencia al logaritmo neperiano de n.

Tomemos por ejemplo la búsqueda de la palabra special sobre la primera fila de la tabla, que myisam_ftdump identifica como fila 0 (cero).

Para la primera formula: (log(dtf)+1)/sumdtf * U/(1+0.0115*U);

dft special aparece dos veces en la fila 0, así que log(dtf()+1) = 0.6931472 + 1 = 1.6931472
sumdft special aparece 2 veces en la fila 0, añadimos log(2)+1
times aparece 1 vez en la fila 0, añadimos log(1)+1
require aparece 1 vez en la fila 0, añadimos log(1)+1
socks aparece 1 vez en la fila 0, añadimos log(1)+1
el cálculo queda sumdtf = log(2)+1 + (log(1)+1)*3 = 4.6931472
U Hay 4 términos únicos en la fila 0, por lo que U/(1+0.115*U) = 4/(1+0.0115*4) = 3.824092

peso_local = 1.6931472 / 4.6931472 * 3.824092 = 1.3796179. El mismo número que sale en el volcado del indice proporcionado por myisam_ftdump.

Para la segunda formula: log((N-nf)/nf);

N Hay 4 filas en la tabla quotes
nf El término special tiene ocurrencias en 1 fila.

peso_global = log((N-nf)/nf) = log(3) = 1.0986123. El mismo número que devuelve myisam_ftdump en el volcado de pesos por palabra.

Para la tercera fórmula: peso_consulta = peso_local * peso_global * qf;

peso_local 1.3796179
peso_global 1.0986123
qf special aparece 1 vez en la consulta.

peso_consulta = 1.3796179 * 1.0986123 * 1 = 1.5156652. Finalmente esta es la relevancia de la consulta sobre la tabla de ejemplo.

Está sacado de esta dirección que puede ser útil a alguien, pero el enlace ahora no funciona:
http://quarkblog.org/2007/01/14/mysq...-para-humanos/

Última edición por jurena; 23/06/2010 a las 04:04