Поиск в MySQL через match() against()?

Здравия желаю!


У меня есть поиск который ищет с помощью 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('&gt;&gt;&quot;compact disc&quot; &gt;(+compact* +disc* ) &lt;(compact* disc* )' IN BOOLEAN MODE) as rel FROM icons <br/>
WHERE MATCH (tags) AGAINST('&gt;&gt;&quot;compact disc&quot; &gt;(+compact* +disc* ) &lt;(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.
  • Вопрос задан
  • 27124 просмотра
Пригласить эксперта
Ответы на вопрос 3
XaosSintez
@XaosSintez
Используйте Sphinx. Полнотекствоый поиск в MySQL — та еще кака
Ответ написан
Melanitsky
@Melanitsky
LIKE дает неймоверную нагрузку на СУБД.
Все зависит от кого какой engine таблицы вы испольуете. Для полнотекстовго поиска с учетом мофологии лучше всего использвать sphinx.
Если делать через match это лучше всего MyISAM.
SELECT word FROM table WHERE
MATCH (word) AGAINST ('cat*' IN BOOLEAN MODE)

а вообще www.mysql.ru/docs/man/Fulltext_Search.html
Ответ написан
Если строка с тэгами в базе будет начинаться с пробела и оканчиваться пробелом, то не надо будет делать три условия: )
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы