Изглежда, че таблиците на InnoDB не позволяват търсене в няколко пълнотекстови индекса в един и същ MATCH()
състояние.
Тук вашите полета не принадлежат на една и съща таблица, поради което са покрити от различни индекси. Забележете, че същото ограничение важи, ако имате таблица като тази:
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
Изглежда пълнотекстово търсене може да търси само в първия пълнотекстов индекс, който среща но това е само нещо, което изваждам от този опит , моля, не приемайте това за даденост.
Изводът е, че трябва да разделите търсенето си, така че да използвате един единствен пълнотекстов индекс за MATCH()
клауза:
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...
Това е илюстрация на възможна заявка, ако сте имали два различни индекса на auction
и един за user
. Трябва да го адаптирате към действителната си структура (моля, публикувайте описанията на таблиците си, ако имате нужда от повече насоки).
Забележете, че това се отнася само за таблици InnoDB. Интересното е, че MyISAM таблиците изглежда не показват същото ограничение .
Актуализация:оказва се, че това е бъг в двигателя InnoDB
, фиксиран в 5.6.13/5.7.2. Горният пример сега с право се проваля с „Не мога да намеря FULLTEXT индекс, съответстващ на списъка с колони“. Всъщност няма индекс на (f1, f2)
, но един на (f1)
и още един на (f2)
. Както съветва регистърът на промените :
Трябва да се отбележи, че докато такива заявки връщат правилен набор от резултати с MyISAM, те работят по-бавно, отколкото може да се очаква, както те безшумно игнорират съществуващите пълнотекстови индекси .