Mysql
 sql >> Base de données >  >> RDS >> Mysql

Recherche en texte intégral MySQL sur plusieurs colonnes :confusion des résultats

Il semble que les tables InnoDB n'autorisent pas les recherches sur plusieurs index de texte intégral dans le même MATCH() état.

Ici vos champs n'appartiennent pas tous à la même table, ils sont donc couverts par des index différents. Notez que la même limitation s'applique si vous aviez un tableau comme celui-ci :

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

Il ressemble une recherche de texte intégral ne peut rechercher que sur le premier index de texte intégral qu'elle rencontre mais ce n'est que quelque chose que je déduis de cette expérience , s'il vous plaît ne prenez pas cela pour acquis.

L'essentiel est que vous devez diviser votre recherche afin d'utiliser un seul index de texte intégral par MATCH() clause :

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...

Ceci est une illustration d'une requête possible si vous aviez deux index distincts sur auction et un sur user . Vous devez l'adapter à votre structure actuelle (veuillez poster les descriptions de vos tableaux si vous avez besoin de plus de conseils).

Notez que cela ne s'applique qu'aux tables InnoDB. Fait intéressant, les tables MyISAM ne semblent pas afficher la même limitation .

Mise à jour :il s'avère que c'était un bogue dans le moteur InnoDB , corrigé en 5.6.13/5.7.2. L'exemple ci-dessus échoue maintenant à juste titre avec "Impossible de trouver l'index FULLTEXT correspondant à la liste des colonnes". En effet, il n'y a pas d'index sur (f1, f2) , mais un sur (f1) et un autre sur (f2) . Comme le changelog le conseille :

Il est à noter que même si de telles requêtes renvoient un jeu de résultats correct avec MyISAM, elles s'exécutent plus lentement que prévu, car ils ignorent silencieusement les index de texte intégral existants .