Собственно есть поле tags, а в нем содержаться теги перечисленные через запятую. Т.е так
слово, слово , два слова,еще тег какой-то, моежт быть целое выражение,
Поисковый запрос состоит из слова, но в поле этот тег может быть как вначале, так и в конце, может быть отделен запятыми с двух сторон или с одной, может быть запятая и пробел, затем слово и в конце запятая и так далее. Но важно, чтобы введя запрос "слово" нашлись только те у кого есть "слово" но такие теги как "слово второе, слово третье, еще слово," не попали под критерий.
Делается это так.
1. Создается таблица тегов. Там только id и тег.
2. Для каждой тегируемой сущности создается таблица отношений. Там хранятся id сущности и id тега. Сколько тегов у сущности, столько записей в таблице отношений с id этой сущности.
И соответственно поиск по тегам тогда выполняется как поиск точного соответствия.
Алсо, так, как делаете вы, можно реализовать на монге например.