Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Volltextsuche über mehrere Spalten:Ergebnisverwirrung

Es scheint, dass InnoDB-Tabellen keine Suche über mehrere Volltextindizes im selben MATCH() zulassen Zustand.

Hier gehören Ihre Felder nicht alle zu derselben Tabelle, daher werden sie von unterschiedlichen Indizes abgedeckt. Beachten Sie, dass die gleiche Einschränkung gilt, wenn Sie eine Tabelle wie diese haben:

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

Es sieht so aus eine Volltextsuche kann nur im ersten Volltextindex suchen, auf den sie trifft aber das ist nur etwas, was ich abziehe aus dieser Erfahrung , betrachten Sie dies bitte nicht als selbstverständlich.

Unter dem Strich sollten Sie Ihre Suche aufteilen, um einen einzigen Volltextindex pro MATCH() zu verwenden Klausel:

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

Dies ist eine Veranschaulichung einer möglichen Abfrage, wenn Sie zwei unterschiedliche Indizes für auction hätten und eine auf user . Sie müssen es an Ihre tatsächliche Struktur anpassen (bitte posten Sie die Beschreibungen Ihrer Tabellen, wenn Sie weitere Anleitungen benötigen).

Beachten Sie, dass dies nur für InnoDB-Tabellen gilt. Interessanterweise scheinen MyISAM-Tabellen diese Einschränkung nicht aufzuweisen .

Update:Es stellte sich heraus, dass dies ein Fehler in der InnoDB-Engine war , behoben in 5.6.13/5.7.2. Das obige Beispiel schlägt nun zu Recht mit "Kann den FULLTEXT-Index nicht finden, der mit der Spaltenliste übereinstimmt" fehl. Tatsächlich gibt es keinen Index auf (f1, f2) , aber eine auf (f1) und ein weiteres auf (f2) . Wie im Änderungsprotokoll angegeben :

Es ist bemerkenswert, dass solche Abfragen zwar mit MyISAM eine korrekte Ergebnismenge zurückgeben, aber langsamer ausgeführt werden, als man erwarten könnte, da Sie ignorieren stillschweigend vorhandene Volltextindizes .