Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как правильно сделать поиск


Автор: kulikoff 16.2.2011, 17:13
Добрый день! Помогите реализовать поиск по заданному полю в базе данных. Проблема вот в чем: 
Есть запись в поле, скажем "Intel Core i5-2300". Как сделать так, чтоб оно находилу эту запись, если человек ввел в поле поиска
1. Intel Core i5-2300
2. Intel Core i5 2300
3. Intel Core i5_2300
4. Intel Socket 775 Core i5-2300

и т.д.

Буду премного благодарен за помощь

Автор: WolfAlone 16.2.2011, 17:25
Думаю, что оптимально будет это выглядеть примерно так:
Код

SELECT * FROM price WHERE name LIKE "%Intel% %Core% %i5% %2300%"


Для этого, мы берём строку для поиска, которую ввёл пользователь, разбиваем её на отдельные слова, например с помощью функции: explode() (http://www.php.ru/manual/function.explode.html), и генерируем запрос по образцу выше.

P.S. Привожу пример как один из вариантов решения проблемы, без претензий на "панацею" и/или 100% решение.

Добавлено через 4 минуты и 19 секунд
Если Вам нужно искать совпадение хотя бы с одним из слов, можно между %слово% вставить оператор OR, тогда он будет искать хотя бы одно вхождение.

Ещё можно посмотреть вот это:

http://www.mysql.ru/docs/man/Fulltext_Search.html - полнотекстовый поиск в MySQL (возможно, как "вариант №2")

Автор: kulikoff 16.2.2011, 17:33
Так вот вопрос в чем, не просто разбить на слова, а как исключить неважные символы (в данном случае в дефис, пробел, подчеркивание), ведь каждый пишет как-то по-своему, а чтоб товар искало необходимый

Автор: patap 16.2.2011, 17:44
ну, как вариант, можно подготавливать строку для поиска, перед тем как ее в базу пихать, удаляя/заменяя проблемные символы

Автор: WolfAlone 16.2.2011, 17:47
Ну тогда делаем так:

Прогоняем строку поиска через функцию: http://www.php.ru/manual/function.str-replace.html - 1-ый раз удаляем тире. Прогоняем второй раз, удаляем подчёркивание (символ "_"). Если нужно удалить ещё какой-то символ - прогоняем третий раз, и т.д. 
*То есть, не совсем удаляем, а заменяем на пробел.

Потом, с помощь explode() разбиваем строку на конкретные слова, задав в качестве разделителя слов " " (пробел). Получаем массив слов. Проходим по массиву, с помощью foreach и создаём из него строку, где каждое слово будет заключено между символами "%".

Вообще, вариантов масса, можно и с регулярными выражениями по извращаться. Я привожу лишь вариант, который мне приходит в голову первым.

Добавлено через 2 минуты и 7 секунд
Да, ещё там не плохо было бы удалить пустые значения из массива, при использовании функции explode(), т.к. пользователь может лишних пробелов натыкать в строку и получатся слова длиной в 0 символов, что не есть хорошо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)