Здравия желаю!
У меня есть поиск который ищет с помощью match() against(). Но проблема в том что он не совсем точно дает результаты. Например если делать поиск «cat» он выводит на первую полосу не кошек, а то что содержит «Category».
Вопрос простой —
Как мне сделать LIKE '% cat %' OR tags LIKE '% cat' OR tags LIKE 'cat %' в match() against()
Более подробно:
Теги хранятся в виде «animal cat happy» или "" «inventory categories»
Вот sql на поиск compact disc
SELECT *, MATCH (tags) AGAINST('>>"compact disc" >(+compact* +disc* ) <(compact* disc* )' IN BOOLEAN MODE) as rel FROM icons <br/>
WHERE MATCH (tags) AGAINST('>>"compact disc" >(+compact* +disc* ) <(compact* disc* )' IN BOOLEAN MODE) <br/>
ORDER BY rel DESC
если делать запрос через LIKE приходится делать UNION чтобы распределить данные по релевантности (в случае со словом «cat»)
(SELECT * FROM icons WHERE tags LIKE '% cat %' OR tags LIKE '% cat' OR tags LIKE 'cat %')<br/>
UNION<br/>
(SELECT * FROM icons WHERE tags LIKE '%cat%')<br/>
В этом случае результат выходит получше, но больше нагрузка на сервер если поиск идет по 2м и более словам.
Я пробовал вытащить тэги в отдельную таблицу и создать отношение «many-to-many», но и это загружает сервер больше чем вариант с match against.