sql >> Database >  >> RDS >> Mysql

MySQL fulltext zoeken over meerdere kolommen:resultaatverwarring

Het lijkt erop dat InnoDB-tabellen geen zoekopdrachten over meerdere fulltext-indexen in dezelfde MATCH() toestaan staat.

Hier behoren uw velden niet allemaal tot dezelfde tabel, daarom worden ze gedekt door verschillende indexen. Merk op dat dezelfde beperking van toepassing is als u een tabel als deze had:

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

Het ziet eruit als een fulltext-zoekopdracht mag alleen zoeken op de eerste fulltext-index die het tegenkomt maar dit is alleen iets wat ik afleid van deze ervaring , neem dit alsjeblieft niet als vanzelfsprekend aan.

Het komt erop neer dat u uw zoekopdracht moet splitsen om één enkele volledige tekstindex per MATCH() te gebruiken. clausule:

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

Dit is een illustratie van een mogelijke zoekopdracht als u twee verschillende indexen had op auction en één op user . Je moet het aanpassen aan je huidige structuur (post de beschrijvingen van je tabellen als je meer begeleiding nodig hebt).

Merk op dat dit alleen van toepassing is op InnoDB-tabellen. Interessant is dat MyISAM-tabellen niet dezelfde beperking lijken te vertonen .

Update:het blijkt dat dit een bug in de InnoDB-engine was , vastgesteld in 5.6.13/5.7.2. Het bovenstaande voorbeeld faalt nu terecht met "Kan de FULLTEXT-index niet vinden die overeenkomt met de kolomlijst". Er is inderdaad geen index op (f1, f2) , maar één op (f1) en nog een op (f2) . Zoals de changelog adviseert :

Het is opmerkelijk dat hoewel dergelijke zoekopdrachten een correcte resultatenset met MyISAM retourneren, ze langzamer werken dan je zou verwachten, zoals ze negeren stilletjes bestaande fulltext indexen .




  1. Toon de sortering in MariaDB

  2. MySQL Unieke beperking toevoegen

  3. MariaDB JSON_OBJECT() uitgelegd

  4. Blob exporteren van MySQL-database naar bestand met alleen SQL