Я в процессе перехода на MariaDB на RDS. Мои столы в рабочем состоянии, и все выглядит хорошо, но, учитывая, что я использую MariaDB 10.0.24, я подумываю о переключении нескольких моих таблиц MyISAM на Innodb. До этого мне требовалось использовать MyISAM, потому что InnoDb не поддерживал полнотекстовый формат. Но, насколько я понимаю, MariaDB> 10.0.5 поддерживает полнотекстовый поиск на InnoDB.
В своей первой попытке я преобразовал таблицу из MyISAM в InnoDB, используя:
ALTER TABLE `courses` ENGINE=INNODB
Но после этого мои индексы FULLTEXT, похоже, были сброшены. Они все еще там перечислены, но не отвечают на поиск по ПОЛНОТЕКСТУ.
Can't find FULLTEXT index matching the column list
Кроме того, когда я пытаюсь создать новые FULLTEXT INDEXES в таблице, я больше не могу их создавать - доступны только INDEX и UNIQUE.
Наконец, хотя я вижу настройки в моей группе параметров RDS, которые позволяют мне настраивать параметры INNODB FULLTEXT, я не видел никаких настроек, которые позволили бы мне «включить его», поэтому я предполагаю, что он включен по умолчанию.
Я застрял в MyISAM или можно изменить эти таблицы на InnoDB, и я просто не понял, как это сделать?
Спасибо за вашу помощь!
Обновить:
ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ:
CREATE TABLE `courses` (
`id` varchar(32) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`description` text,
`instructor_id` varchar(32) DEFAULT NULL,
`catalog_id` varchar(32) NOT NULL,
`site_id` varchar(32) NOT NULL,
`created_on` datetime NOT NULL,
`modified_on` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `site_id` (`site_id`),
KEY `instructor_id` (`instructor_id`),
KEY `catalog_id` (`catalog_id`),
FULLTEXT KEY `name_description` (`name`,`description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Запрос:
SELECT `c`.*, (MATCH (c.name) AGAINST ('+yoga*' IN BOOLEAN MODE)) AS `nameRelevance`, (MATCH (c.description) AGAINST ('+yoga*' IN BOOLEAN MODE)) AS `descriptionRelevance` FROM `courses` AS `c` WHERE (c.catalog_id IN ('xxxxx')) AND (c.site_id = 'yyyyy') AND (MATCH (c.name, c.description) AGAINST ('+yoga*' IN BOOLEAN MODE) OR MATCH (c.name, c.description) AGAINST ('+yoga*' IN BOOLEAN MODE))
Ошибка: не удается найти индекс FULLTEXT, соответствующий списку столбцов
Хорошо, я разобрался. Похоже, что в таблицах MyISAM мой запрос к полям имени и описания работает даже без отдельного ключа FULLTEXT для имени или описания. Т.е. в моем приведенном выше определении вы можете видеть, что я добавил один ПОЛНЫЙ ТЕКСТ ИНДЕКС для комбинации name_description
, но в моем запросе я также настраиваю индивидуальный таргетинг на эти столбцы. В MyISAM это работает. В InnoDb этого не происходит.
Решением было создание отдельных ПОЛНОТЕКСТОВЫХ ИНДЕКСОВ для имени и описания вместе с комбинированным индексом. Теперь мой запрос отлично работает!