2011-09-08 15 views
6

¿Hay expertos en MySQL con texto completo?Uniones de MySQL y búsqueda de texto completo

Ayer escribí una pregunta pidiendo sugerencias sobre cómo usar la búsqueda de texto completo con muchas combinaciones, un poco perezosamente, en realidad no lo había intentado.

Desde entonces, he tenido un buen intento de dominarlo yo mismo, creando algunas consultas de prueba exitosas, contra mis campos de texto completo. Si NO uso ninguna combinación, y consulto cada campo individualmente, las funciones de texto completo funcionan perfectamente y relevancia/boolean funciona muy bien con un gran rendimiento también ... pero ... tan pronto como agregue mis uniones para ejecutar la consulta completa , funciona para siempre.

¿Alguien puede detectar algo en mi consulta que pueda causar que esto suceda, porque como aficionado, realmente no puedo verlo!

SELECT 

photos.photoID, 
photos.headline, 
photos.dateCreated, 
MATCH (people.people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Rel1 

FROM photos 

LEFT JOIN (photoPeople INNER JOIN people ON photoPeople.peopleID = people.PeopleID) 
ON photos.photoID = photoPeople.photoID AND MATCH (people.people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 

WHERE 

photos.photoStatus = 'Live' 

GROUP BY 

photos.photoID 

ORDER BY Rel1 

Ésta es una de mis exitosos, individuales, consultas:

SELECT 

photoID, 
headline, 
dateCreated, 
MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Relevance 

FROM photos 

WHERE 

photoStatus = 'Live' 

AND 

MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 

ORDER BY Relevance 

Este es el esquema de base de datos:

photos (tbl) 
photoID    INT(11)   Primary  Auto-Increment 
headline   Long-Text 
caption    Long-Text/FULLTEXT 
dateCreated   DateTime 

people (tbl) 
peopleID   INT(11)   Primary  Auto-Increment 
people    VarChar(255)/FULLTEXT 

photoPeople (tbl) 
photoID    INT(11) 
peopleID   INT(11) 

keywords (tbl) 
keywordID   INT(11)   Primary  Auto-Increment 
keyword    VarChar(255)/FULLTEXT 

photoKeyword (tbl) 
photoID    INT(11) 
keywordID   INT(11) 

photoContributor (tbl) 
photoID    INT(11) 
contributorRef  VarChar(100)/FULLTEXT 

Y esta es mi EXPLICAR impresión:

 
id select_type   table    type  possible_keys  key  key_len  ref  rows 
1 SIMPLE    photos    ALL   NULL    NULL  NULL  NULL  89830 
1 SIMPLE    photoContributor ALL   NULL    NULL  NULL  NULL  149635 
1 SIMPLE    photoPeople   ALL   NULL    NULL  NULL  NULL  110606 
1 SIMPLE    people    eq_ref  PRIMARY    PRIMARY  4  1 
1 SIMPLE    photoKeyword  ALL   NULL    NULL  NULL  NULL  699102 
1 SIMPLE    keywords   eq_ref  PRIMARY    PRIMARY  4  1 

El visitante de mi sitio web debería ser capaz de buscar: "Brad Pitt Angelina Jolie Dorchester Hotel Gafas de sol @MG" - Esto debería encontrar "Brad Pitt" y "Angelina Jolie" de la mesa "people.people" y posiblemente la tabla "photos.caption" también. También debería encontrar "Dorchester Hotel" de la tabla "photos.caption", "Sunglasses" de la tabla "keywords.keyword" y, por último, debería encontrar "@MG" en la tabla "photoContributor.contributorRef".

Cualquier ayuda en esto sería recibida con gratitud ...

+0

agrega '' EXPLAIN SELECT ... a su pregunta – sanmai

+0

Como referencia, si se están expandiendo sobre una cuestión, sin cambiar realmente la información básica pedido, a continuación, sólo debe editar el original, en lugar de empezar de nuevo. – Orbling

+0

Debe pegar el esquema para esas tablas (el resultado de las consultas 'SHOW CREATE TABLE' debería estar bien). Además, para ser claros, parece que está utilizando la indexación de texto completo de MyISAM. – TehShrike

Respuesta

3

sugiere emplear separar consultas más pequeñas y usando UNION para crear un conjunto de resultados combinados.

Aquí hay otra pregunta con una tarea similar. Mysql Full text search across more than one table

actualización

SELECT "Photos" AS TableName, photoID AS ID, MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Relevance 
FROM photos 
UNION ALL 
SELECT "People" AS TableName, peopleID AS ID, MATCH (people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 
FROM people 
UNION ALL 
SELECT "Keyword" AS TableName, keywordID AS ID, MATCH (keyword) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 
FROM keyword 

que no se sabe muy bien los datos que tienes, pero sería producir algo como:

Nombre de la tabla | ID | Relevancia

Fotos | 1 | 1

Fotos | 2 | 0

Personas | 1 | 1

Palabra clave | 10 | 1

Puede agregar cláusulas adicionales para satisfacer sus necesidades, pero esta es la idea básica.

+0

Pero UNION no une los resultados con las mismas columnas. Todas las tablas que consulto tienen columnas diferentes ... – TheCarver

+0

Union requiere que las columnas tengan el mismo tipo de datos, no el mismo nombre. – Jrod

+0

Gracias por su respuesta. No estoy seguro de cómo para implementar esto en el tipo de búsqueda que tengo – TheCarver

Cuestiones relacionadas