Mysql
 sql >> Database >  >> RDS >> Mysql

Ricerca fulltext MySQL su più colonne:confusione nei risultati

Sembra che le tabelle InnoDB non consentano ricerche su più indici fulltext nello stesso MATCH() condizione.

Qui i tuoi campi non appartengono tutti alla stessa tabella, quindi sono coperti da indici diversi. Nota che la stessa limitazione si applica se hai una tabella come questa:

CREATE TABLE t (
  f1 VARCHAR(20),
  f2 VARCHAR(20),
  FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;

SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row

sembra una ricerca fulltext può cercare solo nel primo indice fulltext che incontra ma questo è solo qualcosa che deduco da questa esperienza , per favore, non darlo per scontato.

La conclusione è che dovresti dividere la tua ricerca in modo da utilizzare un singolo indice fulltext per MATCH() clausola:

SELECT * FROM auction, user, gallery, ...
WHERE
    MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(user.field1, user.field2, user.field3) AGAINST...

Questa è un'illustrazione di una possibile query se avevi due indici distinti su auction e uno su user . Devi adattarlo alla tua struttura attuale (per favore pubblica le descrizioni delle tue tabelle se hai bisogno di ulteriori indicazioni).

Nota che questo si applica solo alle tabelle InnoDB. È interessante notare che le tabelle MyISAM non sembrano mostrare la stessa limitazione .

Aggiornamento:si scopre che questo era un bug nel motore InnoDB , fissato in 5.6.13/5.7.2. L'esempio precedente ora non riesce giustamente con "Impossibile trovare l'indice FULLTEXT corrispondente all'elenco delle colonne". In effetti, non esiste un indice su (f1, f2) , ma uno su (f1) e un altro su (f2) . Come consiglia il log delle modifiche :

È interessante notare che, sebbene tali query restituiscano un set di risultati corretto con MyISAM, vengono eseguite più lentamente di quanto ci si potrebbe aspettare, come ignorano silenziosamente gli indici fulltext esistenti .