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

Fulltext search por varias tablas

Estas en el tema de Fulltext search por varias tablas en el foro de Mysql en Foros del Web. Hola foro, A ver si me pueden dar una mano. Tengo algo asi: Tabla Libros Libroid PK LibroNom AutId FK autores EdiId FK Editoriales Tabla ...
  #1 (permalink)  
Antiguo 21/06/2010, 13:21
 
Fecha de Ingreso: agosto-2007
Mensajes: 32
Antigüedad: 17 años, 3 meses
Puntos: 0
Pregunta Fulltext search por varias tablas

Hola foro,
A ver si me pueden dar una mano.

Tengo algo asi:


Tabla Libros
Libroid PK
LibroNom
AutId FK autores
EdiId FK Editoriales

Tabla Autores
AutId PK
AutNom

Tabla Editoriles
EdiId PK
EdiNom

Quisiera armar una bùsqueda fulltext tal que pueda encontrar los libros ya sea por LibroNom, AutoNom y/o EdiNom
Es decir, tener una búsqueda que busque por todos esos criterios.
Supongo que lo primero seria indexar fulltext Libros.LibroNom, Autores.AutNom y Editoriales.EdiNom, pero no me doy cuenta como armar el join.
Gracias de antemano

Un saludo.
  #2 (permalink)  
Antiguo 21/06/2010, 14:48
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Fulltext search por varias tablas

Antes de seguir, ¿cómo harás para asignar dos autores a un libro, y tres? Necesitarás una tabla más, autorlibro (su propio id auto_increment, autoId FK y libroId FK), y sacar autoid FK de la tabla libros.
Lo otro que preguntas es fácil, creo, de resolver. Pero debo hacerte algunas advertencias. La primera es que si estás usando InnoDb como motor, no podrás hacer índices full text. Otra cosa, y por aquí parece ir tu pregunta, es que no puedes hacer un índice full text de dos campos de tablas distintas. Pero eso no supone un problema: te bastará con unir las dos consultas con OR. Primero cruzas las tablas con los INNER JOIN que necesites, y luego haces la consulta.
SELECT... INNER JOIN ON... INNER JOIN ON ... WHERE MATCH(indicecampotabla1) AGAINST('dato1') OR MATCH(indicecampotabla2) AGAINST('dato1')
Esta es la idea.
  #3 (permalink)  
Antiguo 22/06/2010, 07:14
 
Fecha de Ingreso: agosto-2007
Mensajes: 32
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: Fulltext search por varias tablas

Hola jurena, gracias por responder.
De lo primero, es totalmente cierto, la cosa es que viene de un sistema hecho en visual basic / access y hay casi 200 mil ejemplares en la base.
En su momento propuse acomodar los datos pero no quisieron, asi que bueno, asi quedó, y cuando hay mas de un autor se guarda autor=2 nombre="juan, pedro y luis" por ejemplo.

De lo segundo, esta clarisimo lo que decis, lo probè y anduvo bien de bien. Lo que me queda es como "priorizar" los resultados, es decir, si el usuario ingresa "visual basic ceballos" como hacer para que los primeros registros sean efectivamente los libros de VB del autor Francisco Ceballos.
No se si me explico. Si bien aparece, lo hace en el lugar 40 y pico, y anteriormente aparecen un monton de visual basic de otros autores.
Mil gracias
  #4 (permalink)  
Antiguo 22/06/2010, 17:10
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 19 años, 6 meses
Puntos: 4
Respuesta: Fulltext search por varias tablas

no tengo la forma a la mano, pero debes hacerlo con los scores que te genera la consulta fulltext search

Cita:
Iniciado por pixie72 Ver Mensaje
Hola jurena, gracias por responder.
De lo primero, es totalmente cierto, la cosa es que viene de un sistema hecho en visual basic / access y hay casi 200 mil ejemplares en la base.
En su momento propuse acomodar los datos pero no quisieron, asi que bueno, asi quedó, y cuando hay mas de un autor se guarda autor=2 nombre="juan, pedro y luis" por ejemplo.

De lo segundo, esta clarisimo lo que decis, lo probè y anduvo bien de bien. Lo que me queda es como "priorizar" los resultados, es decir, si el usuario ingresa "visual basic ceballos" como hacer para que los primeros registros sean efectivamente los libros de VB del autor Francisco Ceballos.
No se si me explico. Si bien aparece, lo hace en el lugar 40 y pico, y anteriormente aparecen un monton de visual basic de otros autores.
Mil gracias
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #5 (permalink)  
Antiguo 23/06/2010, 01:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
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
  #6 (permalink)  
Antiguo 23/06/2010, 07:50
 
Fecha de Ingreso: agosto-2007
Mensajes: 32
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: Fulltext search por varias tablas

paaahh !!!
Espectacular, te pasaste mismo.
Mil gracias, no lo he probado pero entiendo mas o menos por donde va la mano.
Voy a interiorizarme un poco mas sobre el tema de las relevancias que no lo tengo claro.
Muchisimas gracias!!!!!! . :)

Etiquetas: busquedas, fulltext, search
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 11:28.