Forum Webscript.Ru
Общие => Базы данных => Тема начата: Abram от 08 Марта 2004, 16:17:46
-
Нужно сделать поиск по сайту:
есть такие таблицы:
таблица новостей news
таблица товаров towars
и т.д
Первое что приходит в голову - искать по порядку news, потом towars и т.д.
Может как-то по другому поступают а я не знаю, подскажите плз. Спасибо
-
Abram:
Может как-то по другому поступают
поступают. делают еще одну таблицу с индексом
-
делают еще одну таблицу с индексом
Можете подробнее объяснить Какая структура у таблицы, что храним в каких полях?
-
храним индексируемые слова (например) и идентификатор, по которому можно потом понять какую страницу показывать пользователю с найденым словом. т.е.
word|id
на вскидку могу припомнить такую технологию хотя бы в скрипте этого форума или phpBB и их клонов
-
ИМХО более логично сделать 2 таблицы:
words: word_id | word - таблица всевозможных слов
page_index: page_id | word_id
-
Макс в принципе согласен. но тут вообще надо отдельно подумать о структуре этих/ой таблиц(ы) применительно непосредственно к самому сайту и к данным, по которым поиск осуществляется
-
вопрос: стоит ли делать поиск по сайту, который привязывается к структуре таблиц, к количеству этих таблиц и т.п.? или лучше скачивать страницу по http индексировать вместе с мета-тегами, тайтлами и т.п.? универсальнее поиск будет.
-
USE:
универсальнее поиск будет.
а зачем писать спайдер, парсер и т.п. если у человека две-три таблицы?
может универсальнее только не разумнее
-
AliMamed:
две-три таблицы
завтра появилось уже три-четыре, а потом еще и поменял их структуру.
а не будет ли такой поиск убогим? или каким способом выводить результаты поиска? что показывать? заголовки страниц? а где их брать?
подскажите. без сарказма, просто интересно.
-
Можно в принципе поюзать поиск какого-нибудь яндекса , с фильтром по своему сайту. Формочку маленьку сделать и все. Правда если сайт коммерческий, то заказчики наверняка не согласятся :(
-
Z@:
Можно в принципе поюзать поиск какого-нибудь яндекса
это очень криво. при чем достаточно трудоемко.
USE:
завтра появилось уже три-четыре, а потом еще и поменял их структуру.
а не будет ли такой поиск убогим?
да. а если одна-две таблицы, то наооборот.
USE:
или каким способом выводить результаты поиска? что показывать? заголовки страниц? а где их брать?
что то я не понял твоей мысли
-
AliMamed:
что то я не понял твоей мысли
на странице результатов поиска мы видим список, где ссылками есть заголовки страниц (то что стоит в тайтл), под ним имеем либо кусок текста, где встречаются искомые слова, либо описания страниц, что более примитивно. так вот вопрос о том, что будет выводиться в результатах? где будешь брать заголовок страницы?
-
USE
Вот я сижу и смотрю... title этой страницы - Forum Webscript.Ru - а я как бы нахожусь даже не в отдельном форуме а в отдельном топике... ;)
Название страниц формируется во время создания индекса и в том же индексе, радом со ссылкой, когда из индексируемых таблиц берутся ключевые слова (поля)...
-
Phoinix
форум в этом плане убогий. надо было: "Forum Webscript.Ru > Общие > Базы данных > Поиск по сайту" или даже просто "Поиск по сайту" ведь все знают по какому сайту поиск осуществлять будут.
Phoinix:
Название страниц формируется во время создания индекса и в том же индексе
на основании чего формируется?
Phoinix:
радом со ссылкой
а ссылкой должен быть тайтл?
-
USE
на основании чего формируется?
Phoinix
когда из индексируемых таблиц берутся ключевые слова (поля)...
Вообщем сугубо по желанию...
а ссылкой должен быть тайтл?
Не понял вопроса...
Можно сразу собирать готовую ссылку типа:
[name page]
Либо два поля в таблице, одно - ссылка, второе - название страницы...
А если ты имеешь ввиду как формировать ссылку на динамичную страницу, коей лента новостей и каталог товаров, скорей всего, является, то здесь я тоже не вижу никаких сложностей, т.к. в любом случае, по какому-то принципу производится отбор данных из таблицы, по этому же принципу делать ссылку...
-
ход мыслей понятен
-
Я пробовал в свое время разные подходы - мура. Потом посидел и написал спайдер, написал к нему парсер и такой поиск получился что плакать хочется до сих пор от счастья, ищет все. Прям маленький Яндекс получился.
-
Почитал я ваш пост, но так и непонял как мне сделать:
1. Есть прайс лист. В нем кроме всего прочего наименования товаров. Например: стул деревянный, стул металлический, стол.
Вся эта инфа храниться в mysql
2. Нужно сделать что бы юзверь мог ввести в строку запроса "стул" и ему вывелись две позиции "стул деревянный, стул металл.".
Как это сделать?
-
Я сделал как советует USE именно универсальный поиск. Написал робота который обходит через ХТТП весь сайт, индексит страницы, засовывает их в одну таблицу, добавляет адрес где была найдена и все. А потом по этому ищещь поиском с которым тоже нужно немного конечно повозиться, но все же чудесно работает.
У меня проблема с этим поиском только одна всего. Хостер поддерживает Save Mode у ПХП и из за этого неработает set_time_limit блин... из за этого когда сейчас сайт сильно розрасся и на индексирование уходит пару тройку минут скрипт обрывается.. Блин. Что делать пока еще недумал.
Если кто знает и по моему моменту посоветуйте пожалуста.
А так поиск - плакать хочется. Вообще если скрипт перестроить немного можно вообще по инету пройтись, или я баловался индексировал чужие сайты для себя... применение спайдеру много есть. Может я неправильно делаю но я так погуду себе вставляю кроном с Гисметео и курсы валют на каждый день.
-
мне не нужно делать полнотекстовый поиск.
у меня есть база mysql, в ней таблице. и поле "name", там хранятся название товаров.
Мне нужно что бы пользователь ввел хочу товар такой-то такой и скрипт прошелся по БАЗЕ и выдал их.
Т.е. я представляю это сделать только с помощью where, но что там вводить, что бы не искало не только точные совпадения но и не полные названия. (пример см. выше)
-
ну тогда поможет LIKE и REGEXP
-
а можно поподробнее об этих функциях, здесь или ссылочку какую. Яндекс не находит про эти функции. Да и пару хранящихся у меня синтаксисов mysql ничего не знают об этих функциях.
-
tomashik
http://www.mysql.com
-
3.3.4.7 Сравнение по шаблонам
В MySQL реализовано стандартное для SQL сравнение по шаблонам, а также особый тип такого сравнения - он основан на использовании выражений, подобных применяющимся в служебных программах Unix (таких, как vi, grep и sed).
В SQL при сравнении по шаблону символ `_\' обозначает любой одиночный символ, а `%\' - определенное количество символов (включая ноль символов). В MySQL в SQL-шаблонах по умолчанию не учитывается регистр символов. При работе с шаблонами SQL использование операторов = или <> не допускается, вместо этого применяются операторы сравнения LIKE или NOT LIKE.
Найти все имена, начинающиеся с `b\', можно следующим образом:
mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Найти все имена, заканчивающиеся на `fy\', можно следующим образом:
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Найти все имена, содержащие `w\', можно следующим образом:
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Найти все имена, содержащие ровно пять символов, можно при помощи шаблонного символа `_\':
mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Во втором типе шаблонов, предусмотренных в MySQL, используются расширенные регулярные выражения. При поиске совпадений на основе такого шаблона шаблоном нужно пользоваться операторами REGEXP и NOT REGEXP (или их синонимами - RLIKE и NOT RLIKE).
Ниже приведены некоторые характеристики расширенных регулярных выражений:
`.\' обозначает любой символ.
Класс символов `[...]\' обозначает любой из символов в скобках. Например, `[abc]\' обозначает `a\', `b\' или `c\'. Набор символов можно обозначить с помощью дефиса. `[a-z]\' обозначает любую букву нижнего регистра, а `[0-9]\' - любую цифру.
`*\' обозначает ноль или более экземпляров символа, стоящего перед ним. Например, `x*\' обозначает любое количество символов `x\', `[0-9]*\' обозначает любое количество цифр, а `.*\' - любое количество любых символов.
Для шаблона выдается совпадение, если поисковый контекст обнаружен в любой из частей значения, в котором производится поиск (для шаблонов SQL совпадение выдается только в случае, если совпадает все значение).
``Закрепить\'\' шаблон так, чтобы проверять совпадения с началом или концом значения можно с помощью символов `^\' (начало) или `$\' (конец), которые располагаются в начале или в конце шаблона соответственно.
Чтобы продемонстрировать работу регулярных выражений, приведенные выше запросы LIKE здесь переписаны с использованием REGEXP.
Найти все имена, начинающиеся с `b\', можно при помощи символа `^\', привязывающего шаблон к началу имени:
mysql> SELECT * FROM pet WHERE name REGEXP "^b";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
В версиях MySQL до 3.23.4 REGEXP учитывает регистр символов, и приведенный запрос не возвратит никаких результатов. Для поиска символов `b\' верхнего или нижнего регистра воспользуйтесь следующим запросом:
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
Начиная с версии MySQL 3.23.4, заставить REGEXP учитывать регистр символов можно с помощью ключевого слова BINARY. В этом запросе положительный результат поиска будет получен только при обнаружении символа \'b\' нижнего регистра в начале имени:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
Найти все имена, заканчивающиеся на `fy\', можно при помощи символа `$\', привязывающего шаблон к концу имени:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Найти все имена, содержащие символ `w\' любого регистра, можно так:
mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Поскольку регулярное выражение выдает положительный результат при совпадении шаблона с любым фрагментом значения, в приведенном выше примере привязывать поиск к любому из концов имени для сравнения полного значения с шаблоном, как это пришлось бы делать для шаблона SQL, не нужно.
Найти все имена, содержащие ровно пять символов, можно, если привязать поиск к началу и концу имени с помощью символов `^\' и `$\' и поставить пять символов `.\' между ними:
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Предыдущий запрос можно записать и при помощи оператора `{n}\' (``повторить-n-раз\'\'):
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
-
tarya
Большое спасибо.
Вот что получилось:
$sql = \'SELECT * \'
. \' FROM `computer` \'
. \' WHERE 1 AND `name` \'
. \' LIKE \\\'%третий%\\\' LIMIT 0, 30\';
Так работает.
$pr="третий";
а ни так, ни так не работает.
$pr="\\\'%третий%\\\'";
-
я сам разобрался.
tarya
а откуда была инфа данная выше?
-
tarya, совсем не обязательно полностью цитировать всю главу из документации. Достаточно просто дать ссылку и/или привести выдержки, но не всю главу.
> а откуда была инфа данная выше?
из документации