sql >> Databasteknik >  >> RDS >> Mysql

MySQL fulltextsökning över flera kolumner:resultatförvirring

Det verkar som att InnoDB-tabeller inte tillåter sökningar över flera fulltextindex i samma MATCH() skick.

Här tillhör inte alla dina fält samma tabell, därför täcks de av olika index. Observera att samma begränsning gäller om du hade en tabell som denna:

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

Det ser ut som en fulltextsökning kanske bara söker på det första fulltextindexet den stöter på men detta är bara något jag drar av från denna erfarenhet , ta inte detta för givet.

Sammanfattningen är att du bör dela upp din sökning så att du använder ett enda fulltextindex per MATCH() klausul:

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

Detta är en illustration av en möjlig fråga om du hade två distinkta index på auction och en på user . Du måste anpassa den till din faktiska struktur (vänligen posta tabellernas beskrivningar om du behöver mer vägledning).

Observera att detta endast gäller InnoDB-tabeller. Intressant nog verkar MyISAM-tabeller inte visa samma begränsning .

Uppdatering:det visade sig att detta var ett fel i InnoDB-motorn , fast i 5.6.13/5.7.2. Ovanstående exempel misslyckas nu med rätta med "Kan inte hitta FULLTEXT-index som matchar kolumnlistan". Det finns faktiskt inget index på (f1, f2) , men en på (f1) och en annan på (f2) . Som ändringsloggen rekommenderar :

Det är anmärkningsvärt att även om sådana frågor returnerar en korrekt resultatuppsättning med MyISAM, kör de långsammare än man kan förvänta sig, eftersom de ignorerar tyst befintliga fulltextindex .




  1. Hur skriptar jag en php-fil för att visa en bild som <img src=/img.php?imageID=32 />?

  2. Skillnader mellan INDEX, PRIMÄR, UNIK, FULLTEXT i MySQL?

  3. MySQL-fråga - använder SUM av COUNT

  4. Vanliga tabelluttryck:När och hur man använder dem