|
| Дата |
|
USD/RUB | 93.7196 | BTC/USD | 62157.8721 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
07.06.2012, 17:03
|
#1
|
Ебланнед
Регистрация: 24.05.2012
Сообщений: 47
Бабло: $12985
|
Живой поиск по базе данных
Есть база mysql ~100,000 наименований.
Нужно сделать "живой поиск" с подсказками и пэйджингом результатов.
Может кто для себя делал или есть готовое решение ,подскажите.
__________________
Человек формирует намерение совершить то, что он намерен совершить,
Просто за счет того, что он намеревается это совершить.
|
|
|
07.06.2012, 19:50
|
#2
|
Senior Member
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
|
Плюсую, тоже интересно решения узнать. Сходу пишу что в голову пришло, сделать таблицы:
(`первый символ`, `20 готовых подсказок`) ~ 50-100 позиций (зависит от фактического набора символов и учёта регистра)
(`первые два`, `20 готовых подсказок`, `список индексов`), ~ до 10 000 позиций.
(`первые три`, `список индексов`) ~ до 1 000 000 позиций.
Третию возможно тоже имеет смысл делать, если "наименование" более 2к или база будет расти.
Как пользоваться? При поступлении одного символа:
выдаём данные из первой таблицы
При поступлении второго:
1. выдаём данные
2. постепенно (не сильно загружая ресурсы, если данных много) вытаскиваем остальные наименования по индексам, что бы с их уже в дальнейшем самостоятельно обрабатывать.
При поступлении третьего:
1. проверяем успели уже вытащить
2. если нет вытаскиваем по индексам все значения, которых должно быть на 3 с лишним порядка меньше чем в базе.
Кажется нормальное решение , на смотря на то что придумал всё с ходу.
Что касается пэйджинга - я просто не знаю что это.
|
|
|
08.06.2012, 08:41
|
#3
|
Senior Member
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
|
Вот что то примеро похожее ...
Цитата:
Сходу пишу что в голову пришло, сделать таблицы:
(`первый символ`, `20 готовых подсказок`) ~ 50-100 позиций (зависит от фактического набора символов и учёта регистра)
(`первые два`, `20 готовых подсказок`, `список индексов`), ~ до 10 000 позиций.
(`первые три`, `список индексов`) ~ до 1 000 000 позиций.
Третию возможно тоже имеет смысл делать, если "наименование" более 2к или база будет расти.
|
это вообще полный финиш и утопия ....
Делать в бд запросы на поиск первых 1 - 2 символов смысла нету будет грузить БД ... ну а дальше кажеться все понятно, ajax подхватывает данные отправляет на сервер -> запрос в БД -> обратно ajax'у .... если что пиши спрашивай ...
а зачем пейджинг в в результатах выпадающего списка ?
|
|
|
08.06.2012, 09:53
|
#4
|
Senior Member
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
|
Цитата:
Сообщение от somebody_
Вот что то примеро похожее ...
|
Давай для начала не путать клиентскую часть и серверную. В этом примере сказано только как клиент сделать, а сервер там как бы в вакууме.
Цитата:
Сообщение от somebody_
бла-бла-бла ... ну а дальше кажеться все понятно,
|
всё понятно, somebody_
Замечу базу это не грузит а разгружает, т.к. работает как кэш. Поиск по совпадению в значении 2кб, или полное соответствие в 2 или 3 байтах - почувствуй разницу. А про первую таблицу я вообще молчу, т.к. её размер 100 строк, по 20 подсказок в каждой строке.
|
|
|
08.06.2012, 09:56
|
#5
|
Je suis moine ivre
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
|
Про LIKE вы, наверное, не слышали
|
|
|
08.06.2012, 10:00
|
#6
|
Senior Member
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
|
Цитата:
Сообщение от Drunk Monk
Про LIKE вы, наверное, не слышали
|
"Поиск по совпадению" = LIKE
P.S. "Производительность" - неа, не слышал. Три дополнительные таблицы со вспомогательными индексами, просто так создаются.
Последний раз редактировалось Venya Tolinov; 08.06.2012 в 10:09.
|
|
|
08.06.2012, 10:50
|
#7
|
Senior Member
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
|
можно LIKE ом делать с лимитом ... и нормик будет ... хотя согласен LIKE не желательно использовать когда много данных ... будет долго выполняться ... но думаю с таким колличеством как у ТС + оптимизированный сервак, будет норм ...
а создавать всякие дополнительные таблицы с индексами и вариациями мне кажеться ненужной тратой времени ... хотя если база будет больше, тогда лайк уже не справиться и нужно будет думать в сторону всяких кэшей и т.д. ...
ну конешно все зависит от структуры данных в БД у ТС ...
|
|
|
08.06.2012, 10:57
|
#8
|
Senior Member
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
|
Вот пример на стороне сервера ... выпадающий поиск по музыкальному сайту ...
Код:
if(isset($_GET['q']) && !empty($_GET['q'])) {
$search_word = iconv('utf-8', 'cp1251', trim($_GET['q']));
$data1=array();
$data2=array();
$allData=array();
$query = "SELECT
DISTINCT
megamusic_artists.name AS name,
'' AS title
FROM
megamusic_artists
LEFT JOIN
megamusic_singles ON megamusic_artists.id = megamusic_singles.artist_id
WHERE
megamusic_artists.name LIKE '%". mysql_real_escape_string($search_word)."%'
ORDER BY megamusic_singles.played DESC
LIMIT 5";
$res = mysql_query($query);
while($row = mysql_fetch_assoc($res)){
$data1[] = $row;
}
//var_dump($data1);
$query = "(SELECT CONCAT(`artist`,'-',`title`) as `name`, `title` FROM `megamusic_tracks` WHERE `title` LIKE '%". mysql_real_escape_string($search_word)."%' ORDER BY `played` DESC LIMIT 3)
UNION
(SELECT CONCAT(`artist`,'-',`title`), `title` as `name` FROM `megamusic_clips` WHERE `title` LIKE '%". mysql_real_escape_string($search_word)."%' ORDER BY `played` DESC LIMIT 2)";
$res = mysql_query($query);
while($row = mysql_fetch_assoc($res)){
$data2[] = $row;
}
$allData = array_merge($data1, $data2);
echo json_encode(json_fix_cyr($allData));
}
p.s.
Код:
$query = "(SELECT CONCAT(`artist`,'-',`title`) as `name`, `title` FROM `megamusic_tracks` WHERE `title` LIKE '%". mysql_real_escape_string($search_word)."%' ORDER BY `played` DESC LIMIT 3)
UNION
(SELECT CONCAT(`artist`,'-',`title`), `title` as `name` FROM `megamusic_clips` WHERE `title` LIKE '%". mysql_real_escape_string($search_word)."%' ORDER BY `played` DESC LIMIT 2)";
$res = mysql_query($query);
не обязательно ... это уже непосредствено в каком виде нада выводить ....
p.s.s. 2 Venya Tolinov так более наглядно на строне сервера ?
|
|
|
08.06.2012, 11:57
|
#9
|
Senior Member
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
|
somebody_
Тебе про "живой поиск" - ты, не у меня вооо-от такая рыба, тебе про базу а ты - не у меня вооооо-ооот такая рыба.
Если бы ТС не знал как запрос с лайком сделать то он наверное бы так и спросил, а если бы у него были вопросы с клиентской частью, но про mysql в вопросе не упоминал. А если ему нужно было просто кондовое решение - то здесь да, ваша рыба съедобна.
P.S.: Я новичок на этом форуме, хоть и "давно" зарегистрирован, поэтому я не знаю какие запросы у авторов тем бывают. После прочитанного не претендую на использовании моего решения. *peace*
|
|
|
08.06.2012, 13:46
|
#10
|
Ебланнед
Регистрация: 24.05.2012
Сообщений: 47
Бабло: $12985
ТС -->
|
ТС
Мужчины не ссорьтесь
База 100,000 наименований товаров.
Живой поиск имеется ввиду как подсказки у Гугла (которые нынче очень модно парсить ).
Пэйджинг имелось ввиду что вывод результатов поиска ,будет разбит на страницы,по 10 результатов на каждую.
С кнопочками назад вперед ,короче стандарт.
Вот здесь нашел ,но их там очень много вариантов.
Но там опять же не прикручен paging.
И вопрос ,что делать с теми юзерами кто не поддерживает javascript. (или пох?)
Мой программист скурился маленько.
Месяц уже в кумаре ,поэтому говорить с ним о чем то бестолку.
__________________
Человек формирует намерение совершить то, что он намерен совершить,
Просто за счет того, что он намеревается это совершить.
|
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
|