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

Помогите с поиском по разным полям товара в магазине.

13.05.2010, 13:02
snip

Зарегистрирован:
2006-09-29
Сообщений: 9

Есть интернет-магазин книг.
У каждой книги есть автор, название и описание.

Например:
Автор:Олег Ржешевский
Название: Сталин и Черчилль
Описание: Книга содержит документы фондов И.Сталина и У.Черчилля, хранящиеся в архивах России, Великобритании и США, раскрывающие дипломатическую и политическую историю антигитлеровской коалиции. На основе официальных записей встреч, бесед и дискуссий Сталина и Черчилля во взаимосвязи с событиями Второй мировой и Великой Отечественной войн рассматриваются советско-английские отношения, поиски двумя "непримиримыми союзниками" компромисса, его возможностей и пределов, значение в этом искусства переговоров и личных отношений.

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

Если использовать стандарнтый поиск нетката (?srchPat[2]=xxx), то мы ничего не найдем, т.к. слова находятся в разных полях.
Если же использовать модуль поиска по сайту, то результат выводится в виде ссылок на страницы и преобразовать его к каталожному виду не представляю как.

Что посоветуете?
13.05.2010, 16:44
Asiat
Аниматика
Asiat

Зарегистрирован:
2005-12-12
Сообщений: 576

Как вариант, поработать с системными настройками компонента.
В них можно сначала разобрать на составляющие запрос пользователя, а затем сформировать условие выборки, по принципу "ИЛИ"
Допустим, если подается параметр $srchPat[2]='Ржешевский Сталин'

Цитата:
$words = explode(" ",$srchPat[2]);
$query_where = "(";
foreach ($words as $word) {
$query_where .= " a.Author LIKE '%$word%' OR a.Name LIKE '%$word%' OR a.Description LIKE '%$word%' OR";
}
$query_where = "1=0 )";


в работе не проверял ...


Разработка сайтов на Netcat с 2006... хм-м ... или 2005 хммм года. В общем, обращайтесь.
13.05.2010, 16:53
snip

Зарегистрирован:
2006-09-29
Сообщений: 9

Благодарю.
Но тогда мы найдем все книги автора и все книги об этом авторе и все книги где есть упоминание про Сталина...
13.05.2010, 16:56
malich
Андрей Малков

Зарегистрирован:
2005-08-09
Сообщений: 522

Скорее всего нужно мучить поиск по сайту:

вы можете создать на странице форму

Код:
<form action='/search/'>
<input type='hiden' name='booksearch' value='1'>
<input type='hiden' name='text' value=''>
</form>


в системных настройках модуля поиск по сайту пишем
Код:
if ($booksearch==1){
$query_where="URL LIKE 'http://site.ru/razdel/%'";
}

Тем самым мы выведем только результаты соответсвующие условию

в списке объектов так же пишем
Код:
".($booksearch==1?"оформление для поиска книг":"оформление для остального сайта")."


2. Можно использовать $query_where в самом компоненте с книгами
Код:
<form action=''>
<input type='hiden' name='booksearch' value='1'>
<input type='hiden' name='text' value=''>
</form>


в системных настройках компонента пишем
Код:
if ($booksearch==1){
$query_where="pole1 LIKE '%$text%' OR pole2 LIKE '%$text%' OR pole3 LIKE '%$text%'";
}

В этом случае все хорошо если мы ищем весь текст, если же нам нужно искать его части, то получается вам нужно поместить пришедшую из формы строку в массив с разделителем пробел и на основе этого массива сформировать условие выборки, в вашем примере "Ржешевский Сталин" должно получиться
Код:
if ($booksearch==1){
$query_where="pole1 LIKE '%Ржешевский%' OR pole2 LIKE '%Ржешевский%' OR pole3 LIKE '%Ржешевский%' OR pole1 LIKE '%Сталин%' OR pole2 LIKE '%Сталин%' OR pole3 LIKE '%Сталин%'";
}

но в таком случае вам нужно подумать, что делать с знаками препинания, лишними пробелами, цифрами ...- всем тем, что не должно влиять на результаты поиска.
13.05.2010, 17:43
Asiat
Аниматика
Asiat

Зарегистрирован:
2005-12-12
Сообщений: 576

snip писал(а):
Благодарю.
Но тогда мы найдем все книги автора и все книги об этом авторе и все книги где есть упоминание про Сталина...

Ну да, так и предполагалось.
Если это не то, тогда я не понял.. Вам обязательно надо вводить поисковый запрос в одно поле? Думается, проще разнести на несколько и не мучиться.

Разработка сайтов на Netcat с 2006... хм-м ... или 2005 хммм года. В общем, обращайтесь.
13.05.2010, 17:53
snip

Зарегистрирован:
2006-09-29
Сообщений: 9

Спасибо коллеги. Пищу для размышлений вы подкинули. Думаю, что свограню что-то из предложенных вариантов.
14.05.2010, 08:58
malich
Андрей Малков

Зарегистрирован:
2005-08-09
Сообщений: 522

Еще не забывайте, что вы можете сделать такой финт:
создайте текстовое поле недоступное некому и в условии добавления и изменения объекта напишите
Код:
$f_pole = "$f_pole1 $f_pole2 $f_pole3 $f_pole4" 

сложите туда все поля по которым вам нужно искать и непосредственно сам поиск делайте по этому полю.
14.05.2010, 10:26
snip

Зарегистрирован:
2006-09-29
Сообщений: 9

А вот это отличная идея, она поможет решить вопрос с поиском по разным полям товаров. Благодарю.
17.05.2010, 17:08
Хыиуду

Зарегистрирован:
2009-10-21
Сообщений: 156

Можно модифицировать код Asiat
$words = explode(" ",$srchPat[2]);
$where=Array();
foreach ($words as $word) {
$where .= " (a.Author LIKE '%$word%' OR a.Name LIKE '%$word%' OR a.Description LIKE '%$word%') ";
}
$query_where.=join(" AND ", $where)
Тогда мы получим поиск всех слов запроса
17.05.2010, 18:50
Asiat
Аниматика
Asiat

Зарегистрирован:
2005-12-12
Сообщений: 576

Угу, кажется это тож самое.
Только топикстартер говорит, что такой поиск не нужен. Я чесн говоря в итоге так и не понял, какой результат надо получить. То что предлагает malich и так понравилось ТС (сливать текст в одно дополнительное поле) - это по-моему то же и даст в результате. Кроме того, мне крайне не нравится идея дублировать два раза один и тот же контент в базе.

Разработка сайтов на Netcat с 2006... хм-м ... или 2005 хммм года. В общем, обращайтесь.
198 196 2010-05-17 18:50:40 9950
Описание проекта