sql >> Databáze >  >> RDS >> Mysql

Fulltextové vyhledávání MySQL ve více sloupcích:zmatek ve výsledku

Zdá se, že tabulky InnoDB neumožňují vyhledávání přes několik fulltextových indexů ve stejném MATCH() podmínka.

Zde vaše pole nepatří do stejné tabulky, proto jsou pokryta různými indexy. Všimněte si, že stejné omezení platí, pokud jste měli tabulku jako je tato:

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

Vypadá to tak fulltextové vyhledávání může hledat pouze na prvním fulltextovém indexu, na který narazí ale toto je pouze něco, co odečítám z této zkušenosti , prosím, neberte to jako samozřejmost.

Základem je, že byste měli vyhledávání rozdělit tak, abyste použili jeden fulltextový index na MATCH() klauzule:

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

Toto je ilustrace možného dotazu, pokud jste měli dva odlišné indexy v auction a jeden na user . Musíte jej přizpůsobit své skutečné struktuře (pokud potřebujete další pokyny, zveřejněte prosím popis svých tabulek).

Všimněte si, že to platí pouze pro tabulky InnoDB. Zajímavé je, že tabulky MyISAM nevykazují stejné omezení .

Aktualizace:ukázalo se, že to byla chyba v enginu InnoDB , opraveno v 5.6.13/5.7.2. Výše uvedený příklad nyní oprávněně selže s "Nelze najít FULLTEXTOVÝ index odpovídající seznamu sloupců". Ve skutečnosti neexistuje žádný index na (f1, f2) , ale jeden na (f1) a další na (f2) . Jak radí changelog :

Je pozoruhodné, že i když takové dotazy vracejí správnou sadu výsledků pomocí MyISAM, běží pomaleji, než by se dalo očekávat, jak je uvedeno tiše ignorují existující fulltextové indexy .




  1. Připojení k SQL Server LocalDB pomocí JDBC

  2. Objektově orientované struktury v relačních databázích

  3. Doctrine 2 mysql FIELD funkce v pořadí podle

  4. MySQL GROUP BY DateTime +/- 3 sekundy