Те кто делали сами модуль поиска по БД, наверняка столкнулись с проблемой отсечки спец символов и пробелов в запросе.
Интересует скрипт php.
Спасибо.
А регулярные выражения не помогают?
Их можно использовать в запросе MySQL
>А регулярные выражения не помогают?
>Их можно использовать в запросе MySQLА пример скрипта можно?
>>А регулярные выражения не помогают?
>>Их можно использовать в запросе MySQL
>
>А пример скрипта можно?А ты перед отправкой в базу замени все спецсимволы на их условное обозначение. Это экранированием называется.
Например:
выаорво\апип&&dgdf#hfgh$jkh@`lkjklkk`kvb
выаорво\0апип\1\1dgdf\2hfgh\3jkh\4\5lkjklkk\5kvbНикаких запретных символов уже нет. И когда отправляем запрос на поиск, в запросе поиска осуществляем соответствующую замену.
Когда же нужно выводить строки пользователю, получая их из базы, то проводим обратную замену.
Как на PHP это делается, не знаю, но на перле очень легко, буквально несколько символов набрать :)
>>>А регулярные выражения не помогают?
>>>Их можно использовать в запросе MySQL
>>
>>А пример скрипта можно?
>
>А ты перед отправкой в базу замени все спецсимволы на их условное
>обозначение. Это экранированием называется.
>
>Например:
>
>выаорво\апип&&dgdf#hfgh$jkh@`lkjklkk`kvb
>выаорво\0апип\1\1dgdf\2hfgh\3jkh\4\5lkjklkk\5kvb
>
>Никаких запретных символов уже нет. И когда отправляем запрос на поиск, в
>запросе поиска осуществляем соответствующую замену.
>
>Когда же нужно выводить строки пользователю, получая их из базы, то проводим
>обратную замену.
>
>Как на PHP это делается, не знаю, но на перле очень легко,
>буквально несколько символов набрать :)// урезаем строку до 64 символов чтобы не нагружать БД
$str = substr($str, 0, 64);
// поисковая строка не менее трех символов, причины см. выше
$str = trim(preg_replace("/\s(\S{1,2})\s/", " ", ereg_replace(" +", " "," $str ")));
// сжатие двойных пробелов
$str = ereg_replace(" +", " ", $str);далее вырезаем хтмл код, пример 5 из документации по preg_replace
// добавляем слэши если надо
if (get_magic_quotes_gpc()) $str = addslashes($str);
// либо вообще вырезаем все "ненормальные" символы
$str = preg_replace("/[^\w\x7F-\xFF\s]/", " ", $str);
Я строю для этой цели отдельную индексную таблицу - база данных обходится, из нее выбираются слова и строится таблица [слово]->[индекс записи].
Тогда довольно шустро работает.Если этого не делать, то поиск (SELECT ... WHERE ... LIKE ...) может стать мучительно долгим, особенно на большой базе, так как на таком запросе не будет работать индексирование.
Дополнительно к такой структуре лекго прикрутить морфологию.
[слово]<->[основная форма слова]. Для экономии места можно морфологические правила хранить в исходном формате, или хранить не слова, а CRC.