|
|
13.05.2010, 13:02
|
|
snip
Зарегистрирован: 2006-09-29
Сообщений: 9
|
Есть интернет-магазин книг.
У каждой книги есть автор, название и описание.
Например:
Автор:Олег Ржешевский
Название: Сталин и Черчилль
Описание: Книга содержит документы фондов И.Сталина и У.Черчилля, хранящиеся в архивах России, Великобритании и США, раскрывающие дипломатическую и политическую историю антигитлеровской коалиции. На основе официальных записей встреч, бесед и дискуссий Сталина и Черчилля во взаимосвязи с событиями Второй мировой и Великой Отечественной войн рассматриваются советско-английские отношения, поиски двумя "непримиримыми союзниками" компромисса, его возможностей и пределов, значение в этом искусства переговоров и личных отношений.
Коллеги, подскажите, как организовать поиск по разным полям товара. При этом, нужно чтобы результаты поиска выдавались в в виде списка товаров. Так же как мы их видим в каталоге интернет-магазина. Например запрос "Ржешевский Сталин". должен вывести список книг, среди которых должна присутствовать обозначенная выше книга.
Если использовать стандарнтый поиск нетката (?srchPat[2]=xxx), то мы ничего не найдем, т.к. слова находятся в разных полях.
Если же использовать модуль поиска по сайту, то результат выводится в виде ссылок на страницы и преобразовать его к каталожному виду не представляю как.
Что посоветуете?
|
|
|
13.05.2010, 16:44
|
|
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 )";
в работе не проверял ...
|
|
|
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
Аниматика
Зарегистрирован: 2005-12-12
Сообщений: 576
|
snip писал(а):Благодарю.
Но тогда мы найдем все книги автора и все книги об этом авторе и все книги где есть упоминание про Сталина...
Ну да, так и предполагалось.
Если это не то, тогда я не понял.. Вам обязательно надо вводить поисковый запрос в одно поле? Думается, проще разнести на несколько и не мучиться.
|
|
|
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
Аниматика
Зарегистрирован: 2005-12-12
Сообщений: 576
|
Угу, кажется это тож самое.
Только топикстартер говорит, что такой поиск не нужен. Я чесн говоря в итоге так и не понял, какой результат надо получить. То что предлагает malich и так понравилось ТС (сливать текст в одно дополнительное поле) - это по-моему то же и даст в результате. Кроме того, мне крайне не нравится идея дублировать два раза один и тот же контент в базе.
|