Создание поиска по сайту

Решил переделать поиск в своем движке магазина. Так как строки названий товаров малы, создавать поисковый индекс нет смысла, а простой LIKE %слово% не даст хороших результатов. Написал небольшой алгоритм, но достаточно эффективный для поиска по магазину.

//убираем из строки спецсимволы, которые могут оказаться необязательными
$string2 = preg_replace('#[-.\'"(),/\;:<>]*#u', '', $string); 
//создаем также копию строки без спецсимволов и пробелов
$string3 = str_replace(' ', '', $string2);
//без пробелов со всеми спецсимволами
$string4 = str_replace(' ', '', $string);
//создаем массив из слов исходной строки      
$words1 = explode(' ', $string);
//и массив слов строки без спецсимволов
$words2 = explode(' ', $string2);
//далее код на ORM коханы, но смысл можно понять зная SQL
$db = DB::select('id','name');//это поля которые нам нужны
$db->from('products')->where('name', 'LIKE', '%' . $string . '%'); //это обычный LIKE с исходной строкой
//затем SQL запрос дополняется тремя вариантами поисковой строки при помощи "OR WHERE"
$db->or_where('name', 'LIKE', '%' . $string2 . '%');
$db->or_where('name', 'LIKE', '%' . $string3 . '%');
$db->or_where('name', 'LIKE', '%' . $string4 . '%');
//и самое интересное... объединяем слова через символ % и добавляем соотв. LIKE
$db->or_where('name', 'LIKE', '%' . implode('%', $words1) . '%');
//также пробуем слова в обратной последовательности, чтобы увеличить шансы пользователя найти то что ищет 
$db->or_where('name', 'LIKE', '%' . implode('%', array_reverse($words1)) . '%'); 
$db->or_where('name', 'LIKE', '%' . implode('%', $words2) . '%');
$db->or_where('name', 'LIKE', '%' . implode('%', array_reverse($words2)) . '%');

На выходе получится примерно такой запрос (пример с поиском строки «green tea»), которому останется только добавить LIMIT :

"SELECT `id`, `name` FROM `products` WHERE `name` LIKE '%green tea%' OR `name` LIKE '%green tea%' OR `name` LIKE '%greentea%' OR `name` LIKE '%greentea%' OR `name` LIKE '%green%tea%' OR `name` LIKE '%tea%green%' OR `name` LIKE '%green%tea%' OR `name` LIKE '%tea%green%'"

Можно было бы еще сделать проверку на повторы строк $string, $string2, $string3, $string4 — но имхо это не выигрыш, а наоборот потеря во времени на лишние проверки — СУБД разберется что проверять, там все продумано…