Как лучше организовать autocomplete-поиск по MySQL-базам?
Есть сквозная форма поиска по веб-приложению (PHP+MariaDB).
Есть примерно 15 SQL-таблиц, по которым осуществляется поиск:
- клиенты
- товары
- сотрудники
и т.д.
В таблицах есть текстовые поля, такие как "имя", "модель", "описание" и т.д.
Сейчас поиск происходит через запрос типа LIKE '%string%', соответственно индексы не используются, и поиск идёт медленно.
Каким образом его ускорить?
- Организовать Fulltext-поиск по существующим таблицам (просто перебирая по очереди все 15) через запрос MATCH AGAINST? Проблема в том, что FULLTEXT строит индексы только по началу слова, а в идеале хотелось бы искать и по середине слова тоже. Например, номер телефона в базе 79112222222, а пользователь может его пытаться найти по 9112222222 или вообще по 2222222. Т.е. запрос LIKE '%222222% ' подходит больше. Аналогично и с названием модели. Плюс FULLTEXT плохо дружит с прочими индексами. Например, если нужно искать не по всем товарам, а только по товарам определённой категории, индекс категорий при запросе не используется.
- Сделать отдельную таблицу с текстами и искать по ней?
- Использовать стороннее решение типа ElasticSearch?
В последнем случае очень хотелось бы, чтобы синхронизация с MySQL была в реальном времени: если был добавлен клиент Маша - нужно чтобы она появилось в поиске сразу.
Последний вариант верный. elastisearch или sphinxsearch. Синхронизацию в реальном времени придется сделать у вас в приложении (пишите новый объект сначала в бд, и потом в es|ss).