2009-07-12 22 views
11

Tengo una serie de tablas que contienen datos que quiero para la búsqueda de texto completo. Intenté combinar las tablas con UNION, pero el resultado pierde su índice de texto completo, por lo que no se puede buscar con texto completo. No creo que poner los datos en una tabla temporal sea el camino a seguir. ¿Existe alguna forma de que pueda buscar texto completo en estas tablas de manera eficiente? ¡Gracias por adelantado!Búsqueda de texto completo de MySQL en varias tablas

ACTUALIZACIÓN: mi consulta de texto completo fue

SELECT ID, Title, Description, Author, MATCH (Title,Tags,Body) AGAINST ("search terms") AS Relevance 
FROM [combination of tables goes here] 
WHERE MATCH (Title,Tags,Body) AGAINST ("search terms") 
+0

¿Está buscando lo mismo en las diferentes mesas o está buscando cosas diferentes? ¿Cuántas tablas incluye? –

Respuesta

12

MySQL no puede hacer un índice de texto completo (ni ninguno) en varias tablas. Así que usar un solo índice está fuera.

Como alternativa, se podría o:

  1. utilizar un índice en cada mesa, y una unión/unión según sea apropiado para recuperar las filas con las características requeridas.

  2. Cree una tabla agregada para aplicar el índice.

  3. Utilice una herramienta como lucene o solr para proporcionar su índice de búsqueda. (Si usted va para cualquier tipo de escala, esto es probablemente la mejor opción)

+0

Al menos en la rama 5.x, las combinaciones que usan índices parecen tener el efecto secundario de que no se puede usar el índice de texto completo. Hace que las consultas sean bastante ineficientes. :/ – Rytmis

+0

Eso es interesante: supongo que es un efecto secundario de que mysql solo pueda usar un índice por tabla. Nunca realmente pensé en eso en el contexto de la búsqueda de texto completo. – benlumley

+0

número uno es lo que estaba tratando de hacer, pero los índices desaparecen después de la unión, el número dos es lo que no quería hacer. gracias por confirmar lo que estaba empezando a entender – Samuel

2

simplemente hacer:

select * from table a where a.col=myval 
union 
select * from table b where b.col=myval 
.. 

índices se utilizan como están con un selecto normal.

1

Con la configuración de su ser lo que parece ser un tipo de tablero de mensajes que se supone que tiene tres tablas (corríjanme si me estoy equivocado):

  1. tabla de mensajes (Message_ID, título, cuerpo, Descripción, Autor)
  2. de código Tabla (tag_id, Nombre)
  3. mensaje Etiquetas (Message_ID, tag_id)

Aquí es cómo lo haría

SELECT Message.Message_ID, Message.Title, Message.Description, Message.Author, 
    IFNULL( 
    MATCH (Name) 
    AGAINST (?) 
    , 
    IFNULL(
     MATCH (Message.Title) 
     AGAINST (?) 
     , 
     MATCH (Message.Body) 
     AGAINST (?) 
    ) 
) AS Relevance 
FROM Message, Tag, Message_Tag 
WHERE Message.Message_ID = Message_Tag.Message_ID AND Message_Tag.Tag_ID = Tag.Tag_ID 
    AND (
    MATCH (Name) 
    AGAINST (?) 
    OR 
    MATCH (Message.Title) 
    AGAINST (?) 
    OR 
    MATCH (Message.Body) 
    AGAINST (?) 
) 
3

Añadir las puntuaciones de relevancia en conjunto:

SELECT ID, Title, Description, Author, 
MATCH (Title) AGAINST ("search terms") + 
MATCH (Tags) AGAINST ("search terms") + 
MATCH (Body) AGAINST ("search terms") 
AS Relevance 
Cuestiones relacionadas