2009-07-12 9 views
11

Ho una serie di tabelle che contengono i dati che voglio cercare nel testo completo. Ho provato a combinare le tabelle con UNION, ma il risultato perde il suo indice di testo completo, quindi non può essere cercato per testo completo. Non penso che mettere i dati in una tabella temporanea sia la strada da percorrere. C'è qualche modo di poter cercare a pieno titolo in queste tabelle in modo efficiente? Grazie in anticipo!Ricerca full text di MySQL su più tabelle

UPDATE: la mia domanda per il documento era

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

Siete alla ricerca per la stessa cosa nelle diverse tabelle o stai cercando cose diverse? Quanti tavoli stai includendo? –

risposta

12

MySQL non può creare un indice di testo completo (o alcuno) su più tabelle. Quindi usare un singolo indice è fuori.

In alternativa, si potrebbe o:

  1. utilizzare un indice su ogni tavolo, e un join/unione come appropriato per recuperare le righe con le caratteristiche richieste.

  2. Creare una tabella aggregata per applicare l'indice a.

  3. Utilizzare uno strumento come lucene o solr per fornire l'indice di ricerca. (Se si sta andando per qualsiasi tipo di scala, questo è probabilmente la migliore opzione)

+0

Almeno nel ramo 5.x, i join che utilizzano indici sembrano avere l'effetto collaterale che non è possibile utilizzare l'indice di testo completo. Rende le query piuttosto inefficienti. :/ – Rytmis

+0

Questo è interessante - suppongo che sia un effetto collaterale di mysql essere in grado di usare solo un indice per tabella. Non ci ho mai pensato sul serio nel contesto della ricerca full-text. – benlumley

+0

Il numero uno è quello che stavo cercando di fare, ma gli indici svaniscono dopo l'unione, il numero due è ciò che non volevo fare. grazie per aver confermato quello che stavo cominciando a capire – Samuel

2

semplicemente:

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

indici sono utilizzati così come sono con un normale select.

1

con la configurazione di essere quello che sembra essere un tipo di message board presumo che ci sono tre tavoli (correggetemi se sbaglio):

  1. Tabella messaggi (message_id, Titolo, corpo, Descrizione, Autore)
  2. Tag Table (Tag_ID, nome)
  3. Messaggio Tag (message_id, Tag_ID)

Ecco come lo farei

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

Aggiungi i rilevanza punteggi insieme:

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