Короче вариант с поисковым движком типа сфинкс или подобного не подходит , тк мой проект сейчас находится не на выделенном серваке и у меня нет прав запуска различных служб. 
покачто вышел из ситуации как
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к записей норм 
если у кого есть идеи по оптимизации буду рад вашему мнению ! ) 
всем спасибо