InstantCMS2: Невозможно отыскать полнотекстовый (FULLTEXT) индекс, соответствующий списку ?
Однажды поймал ошибку на своем проекте, работающем под InstantCMS2 — Невозможно отыскать полнотекстовый (FULLTEXT) индекс, соответствующий списку столбцов.
Окружение:
- InstantCMS 2.15.2
- PHP 7.4.33, Server API: fpm-fcgi
- MySQL: 8.0.33
- Подсистема БД: InooDB
После включения режима отладки можно посмотреть на запрос:
SELECT i.*, MATCH(i.title) AGAINST ('>\"по иску иланской транспортной прокуратуры суд взыскал с оао «ржд» компенсацию морального вреда в пользу семьи погибшего ребенка\" <(транспорт* прокурату* компенсац* морально* погибшег*)' IN BOOLEAN MODE) as `fsort`, u.nickname as `user_nickname`, u.slug as `user_slug`, u.is_deleted as `user_is_deleted`, u.groups as `user_groups`, u.avatar as `user_avatar`, u.privacy_options as `user_privacy_options`, f.title as `folder_title`, cat.title as `cat_title`, cat.slug as `cat_slug`, cat.id as `category_id`
FROM cms_con_news i
FORCE INDEX FOR ORDER BY (dataset_popular_182)
INNER JOIN cms_users as u ON u.id = i.user_id
LEFT JOIN cms_content_folders as f ON f.id = i.folder_id
LEFT JOIN cms_con_news_cats as cat ON cat.id = i.category_id
WHERE (i.date_pub >= DATE_SUB(NOW(), INTERVAL 182 DAY)) AND (MATCH(i.title) AGAINST ('>\"по иску иланской транспортной прокуратуры суд взыскал с оао «ржд» компенсацию морального вреда в пользу семьи погибшего ребенка\" <(транспорт* прокурату* компенсац* морально* погибшег*)' IN BOOLEAN MODE)) AND (i.id <> '919') AND (i.is_approved = '1') AND (i.is_deleted IS NULL) AND (i.is_pub = '1')
ORDER BY fsort desc
LIMIT 5
Система ругается, что в таблице title нет полнотекстового индекса. Идем проверять в phpMyAdmin. Действительно, оказывается из FULLTEXT индексов есть только один и он включает в себя несколько полей, titile, content.
Хотя и есть индекс, вроде-бы покрывающий наши потребности, он нам не подходит, поэтому создаем свой для проблемной таблицы. В моём случае будет так:
ALTER TABLE `cms_con_news` ADD FULLTEXT `title` (`title`);
После этого проблема решилась, ошибка пропала. По причинам — предполагаю, что все произошло из-за того, что не так давно я переводил базу из MyISAM в InooDB.
Спустя некоторое время были ещё аналогичные проблемы, причем пока не могу понять причину их появления.
Ещё запрос:
SELECT 1
FROM cms_con_albums i
WHERE (i.is_pub = '1') AND (i.is_approved = '1') AND (i.is_deleted IS NULL) AND (i.is_parent_hidden IS NULL) AND (MATCH(i.title, i.content) AGAINST ('>\"#фокдельфин\" <(+#фокдель*)' IN BOOLEAN MODE))
Решение:
ALTER TABLE `cms_con_albums` ADD FULLTEXT `fullindex_title_content` (`title`, `content`);