2011-09-08 18 views
6

Qualsiasi esperto di MySQL a tutto testo?MySQL Join e ricerca full text

Ho scritto una domanda ieri per chiedere suggerimenti su come utilizzare la ricerca full-text con un sacco di join, un po 'pigramente, non avevo ancora fatto un tentativo.

Da allora, ho avuto un buon tentativo di padroneggiarlo da solo, costruendo alcune query di prova con successo, contro i miei campi full-text. Se NON utilizzo alcun join e non eseguo query singolarmente su ogni campo, le funzioni full-text funzionano perfettamente e pertinenza/booleano funziona alla grande anche con grandi prestazioni ... ma ... non appena aggiungo i miei join per eseguire la query completa , corre per sempre.

Qualcuno può individuare qualcosa nella mia domanda che potrebbe causare ciò, perché come un dilettante, davvero non riesco a vederlo!

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 

Questo è uno dei miei successo, i singoli, le query:

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 

Questo è lo schema DB:

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 

E questa è la mia stampa SPIEGARE out:

 
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 

Il visitatore del mio sito web dovrebbe essere in grado di cercare: "Brad Pitt Angelina Jolie Dorchester Hotel Sunglasses @MG" - Questo dovrebbe trovare "Brad Pitt" e "Angelina Jolie" dal tavolo "people.people" e probabilmente anche dal tavolo "photos.caption". Dovrebbe anche trovare "Dorchester Hotel" dalla tabella "photos.caption", "Sunglasses" dalla tabella "keywords.keyword" e infine, dovrebbe trovare "@MG" nella tabella "photoContributor.contributorRef".

Qualsiasi aiuto su questo sarebbe ben accetto ...

+0

Aggiungi 'EXPLAIN SELECT ...' alla tua domanda – sanmai

+0

Per avere un riferimento, se si sta espandendo su una questione, senza modificare le informazioni di base richiesto, allora si dovrebbe solo modificare l'originale, piuttosto che ripartire. – Orbling

+0

È necessario incollare lo schema per queste tabelle (il risultato delle query 'SHOW CREATE TABLE' dovrebbe andare bene). Inoltre, per essere chiari, sembra che tu stia usando l'indicizzazione fulltext di MyISAM? – TehShrike

risposta

3

Io suggerisco di usare separare le query più piccoli e usando UNION per creare un set di risultati combinati.

Ecco un'altra domanda con un'attività simile. Mysql Full text search across more than one table

Aggiornamento

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 

Io in realtà non so quali sono i dati che hai, ma sarebbe produrre qualcosa di simile:

Nome tabella | ID | Pertinenza

Foto | 1 | 1

Foto | 2 | 0

Persone | 1 | 1

Parola chiave | 10 | 1

È possibile aggiungere ulteriori clausole in base alle proprie esigenze, ma questa è l'idea di base.

+0

Ma UNION non unisce i risultati con le stesse colonne Tutte le tabelle che chiedo hanno colonne diverse ... – TheCarver

+0

Union richiede che le colonne abbiano lo stesso tipo di dati e non lo stesso nome – Jrod

+0

Grazie per la risposta. per implementarlo nel tipo di ricerca che ho – TheCarver

Problemi correlati