@tcapb1

Как лучше организовать autocomplete-поиск по MySQL-базам?

Есть сквозная форма поиска по веб-приложению (PHP+MariaDB).

Есть примерно 15 SQL-таблиц, по которым осуществляется поиск:
- клиенты
- товары
- сотрудники
и т.д.

В таблицах есть текстовые поля, такие как "имя", "модель", "описание" и т.д.
Сейчас поиск происходит через запрос типа LIKE '%string%', соответственно индексы не используются, и поиск идёт медленно.

Каким образом его ускорить?
- Организовать Fulltext-поиск по существующим таблицам (просто перебирая по очереди все 15) через запрос MATCH AGAINST? Проблема в том, что FULLTEXT строит индексы только по началу слова, а в идеале хотелось бы искать и по середине слова тоже. Например, номер телефона в базе 79112222222, а пользователь может его пытаться найти по 9112222222 или вообще по 2222222. Т.е. запрос LIKE '%222222% ' подходит больше. Аналогично и с названием модели. Плюс FULLTEXT плохо дружит с прочими индексами. Например, если нужно искать не по всем товарам, а только по товарам определённой категории, индекс категорий при запросе не используется.

- Сделать отдельную таблицу с текстами и искать по ней?

- Использовать стороннее решение типа ElasticSearch?
В последнем случае очень хотелось бы, чтобы синхронизация с MySQL была в реальном времени: если был добавлен клиент Маша - нужно чтобы она появилось в поиске сразу.

Или есть какое-то другое решение?
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ответы на вопрос 1
Последний вариант верный. elastisearch или sphinxsearch. Синхронизацию в реальном времени придется сделать у вас в приложении (пишите новый объект сначала в бд, и потом в es|ss).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы