MySQL búsqueda de texto completo a través de múltiples tablas

Tengo una serie de tablas que contienen datos que quiero búsqueda de texto completo. He tratado de combinar las tablas con UNION, pero el resultado pierde su índice de texto completo, así que no puede ser de texto de búsqueda. No creo que poner los datos en una tabla temporal es el camino a seguir. ¿Hay alguna manera de que yo pueda búsqueda de texto de estas tablas de manera eficiente? Gracias de antemano!

ACTUALIZACIÓN:
mi consulta para fulltext 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")
Estás buscando la misma cosa en las diferentes tablas o estás en busca de cosas diferentes? Cuántas mesas están incluidos?

OriginalEl autor Samuel | 2009-07-12

4 respuestas

  1. 12

    MySQL no puede hacer que un texto (o cualquier) índice a través de varias tablas. Así que el uso de un único índice.

    Como una alternativa, usted podría:

    1. Uso de un índice en cada tabla, y una combinación/unión como apropiado para recuperar las filas que cumplan sus requisitos.

    2. Crear un agregado tabla para aplicar el índice.

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

    Al menos en el 5.x rama, se une que el uso de índices parecen tener el efecto secundario de que el índice de texto completo no puede ser usado. Hace las consultas más ineficientes. :/
    Eso es muy interesante – supongo que es un efecto secundario de mysql sólo ser capaz de utilizar un índice para cada tabla. Nunca pensó que en un contexto de búsqueda de texto.
    num uno es lo que yo estaba tratando de hacer, pero el indexs desaparecen después de la unión, num dos es lo que yo no quiero tener que hacer. gracias por la confirmación de lo que estaba empezando a entender

    OriginalEl autor benlumley

  2. 3

    Agregar las puntuaciones de importancia juntos:

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

    OriginalEl autor BigBadMe

  3. 2

    simplemente hacer:

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

    índices son utilizados como están con un normal seleccione.

    OriginalEl autor codymanix

  4. 1

    Con su instalación se de lo que parece ser un tipo de mensaje de la junta supongo que tiene tres tablas (corríjanme si me equivoco):

    1. Tabla De Mensajes (Message_ID, Título, Cuerpo, Descripción, Autor)
    2. Tabla De Etiquetas (Tag_ID, Nombre)
    3. Mensaje De Etiquetas (Message_ID, Tag_ID)

    Aquí es cómo iba a hacerlo

    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 (?)
    )

    OriginalEl autor Justin Giboney

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *