Короче вариант с поисковым движком типа сфинкс или подобного не подходит , тк мой проект сейчас находится не на выделенном серваке и у меня нет прав запуска различных служб.
покачто вышел из ситуации как
SELECT s.* ,st.`name` AS type_name , group_concat(DISTINCT benefits.name SEPARATOR ' ') as concat_bn, st.alias as spot_type_alias, benefits.alias as benefit_alias, CONCAT(" ", group_concat(DISTINCT benefits.id SEPARATOR ' ') ," ") as concat_bn_id,
// для полей s.name , s.track, st.name , st.alias ,benefits.name , benefits.alias в каждой таблице создаем полнотекстовый индекс.
//
// тут считаем релевантность запроса
MATCH(s.name , s.track) AGAINST('+$query') as score,
MATCH(st.name , st.alias) AGAINST('+$query') as stcore,
MATCH(benefits.name , benefits.alias) AGAINST('+$query') as bncore,
( // тут считаем расстояние до точки (тк я ищу точки ) (опционально)
6371 *
acos(cos(radians($lat)) *
cos(radians(s.lat)) *
cos(radians(s.lng) -
radians($lng)) +
sin(radians($lat)) *
sin(radians(s.lat)))
) AS distance
FROM `spots` s
// прикручиваем связь один к одному для поиска по типу из другой таблицы
JOIN `spot_type` st ON s.id_spot_type = st.id
// прикручиваем сводную таблицу для связи многие ко многим для поиска по типам плюшек на точке
join spots_benefits
on spots_benefits.spot = s.id
join benefits
on benefits.id = spots_benefits.benefit
where
//собственно сам поиск
MATCH(s.name, s.track) AGAINST('+$query')
OR MATCH(st.name, st.alias) AGAINST('+$query')
OR MATCH(benefits.name, benefits.alias) AGAINST('+$query')
// групируем элементы из сводных таблиц в одно поле груп_конкат
group by s.id
// ищем по только те что были добавлены в фильтр (опционально) типов
HAVING concat_bn_id like "% 1 %" AND concat_bn_id like '% 2 %' AND s.id_spot_type = 2
// сортируем сначала по релевантности, а потом уже по расстоянию
ORDER BY (score + stcore + bncore) DESC, distance ASC
как-то так... запрос в принципе быстро обрабатывает (примерно 0,005 - 0,01 ) относительно конечно , но для бд с 20к записей норм
если у кого есть идеи по оптимизации буду рад вашему мнению ! )
всем спасибо