Давным давно пришла идея, и несколько дней назад была реализована.
Поиск по сайту.
Приведу код:
[php:1:04cf9b6e54]
$categories_query = mysql_query('
SELECT * FROM products_categories
LEFT JOIN products_categories_keywords ON keyword_category_id = category_id
WHERE category_project_id = "'.Session::$project_id.'" AND
category_deleted = "0"
AND
(
keyword_name LIKE "%'.mysql_real_escape_string($_GET['query']).'%" OR
keyword_name LIKE "%'.mysql_real_escape_string(Text::switchkeys($_GET['query'])).'%" OR
category_name LIKE "%'.mysql_real_escape_string($_GET['query']).'%" OR
category_name LIKE "%'.mysql_real_escape_string(Text::switchkeys($_GET['query'])).'%"
)
group by category_id');
$categories = array();
$categories_count = mysql_num_rows($categories_query);
while($category = mysql_fetch_assoc($categories_query)){
$category_id = $category['category_id'];
$categories[$category_id] = $category;
}
[/php:1:04cf9b6e54]
У нас имеется таблица категорий.
Имеется дополнительная таблица categories_keywords со структурой
keyword_id | keyword_category_id | keyword_name
Мысль уловили?
ф-ия switchkeys
[php:1:04cf9b6e54]
public static function switchkeys($text, $lang = 'ru'){
$ru = array(
"й", "ц", "у", "к", "е", "н", "г", "ш", "щ", "з", "х", "ъ",
"ф", "ы", "в", "а", "п", "р", "о", "л", "д", "ж", "э",
"я", "ч", "с", "м", "и", "т", "ь", "б", "ю",
"Й", "Ц", "У", "К", "Е", "Н", "Г", "Ш", "Щ", "З", "Х", "Ъ",
"Ф", "Ы", "В", "А", "П", "Р", "О", "Л", "Д", "Ж", "Э",
"Я", "Ч", "С", "М", "И", "Т", "Ь", "Б", "Ю"
);
$en = array(
"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]",
"a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'",
"z", "x", "c", "v", "b", "n", "m", ",", ".",
"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]",
"A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'",
"Z", "X", "C", "V", "B", "N", "M", ",", "."
);
if($lang == 'ru'){
return str_replace($en, $ru, $text);
}
if($lang == 'en'){
return str_replace($ru, $en, $text);
}
}
[/php:1:04cf9b6e54]
когда производится поиск, он производится и по названиям и по ключевым словам, и по этим же полям, но с помощью функции switchkeys
Готов выслушать советы по улучшению 
Хм, а зачем я помощью функций? Типо если юзер забыл раскладку сменить? Лучше еще и по транслиту искать
soundex — Возвращает ключ soundex для строки
similar_text — Вычисляет степень похожести двух строк
-
можно применять в алгоритме.
Анархист, это не транслит, если раскладку сменить забыл.
йцукен =>qwerty
добавлено спустя 50 секунд:
Беж, можно и по транслиту, просто контингент сайта данного - Россия
добавлено спустя 2 минуты:
Дополнительная таблица гарантирует более качественный поиск по сайту
добавлено спустя:
наверное, не сильно интересно всем
Istsam, транслит нужен не для тех, у кого клава не русская. А чтоб к примеру можно было в поиск вбивать "функции пхп" и оно находило "функции php". Все таки россияне - народ ленивый. По себе знаю, в гугле никогда не меняю язык при запросе. Все на русском.
25 Июл 2012, 15:08