Живой поиск по базе данных - Форум успешных вебмастеров - GoFuckBiz.com
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB93.7196
BTC/USD62157.8721
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 07.06.2012, 17:03   #1
Сунь-Цзы
Ебланнед
 
Регистрация: 24.05.2012
Сообщений: 47
Бабло: $12985
По умолчанию Живой поиск по базе данных

Есть база mysql ~100,000 наименований.
Нужно сделать "живой поиск" с подсказками и пэйджингом результатов.
Может кто для себя делал или есть готовое решение ,подскажите.
__________________
Человек формирует намерение совершить то, что он намерен совершить,
Просто за счет того, что он намеревается это совершить.
Сунь-Цзы вне форума  
Старый 07.06.2012, 19:50   #2
Venya Tolinov
Senior Member
 
Аватар для Venya Tolinov
 
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
Отправить сообщение для Venya Tolinov с помощью Skype™
По умолчанию

Плюсую, тоже интересно решения узнать. Сходу пишу что в голову пришло, сделать таблицы:
(`первый символ`, `20 готовых подсказок`) ~ 50-100 позиций (зависит от фактического набора символов и учёта регистра)
(`первые два`, `20 готовых подсказок`, `список индексов`), ~ до 10 000 позиций.
(`первые три`, `список индексов`) ~ до 1 000 000 позиций.
Третию возможно тоже имеет смысл делать, если "наименование" более 2к или база будет расти.

Как пользоваться? При поступлении одного символа:
выдаём данные из первой таблицы
При поступлении второго:
1. выдаём данные
2. постепенно (не сильно загружая ресурсы, если данных много) вытаскиваем остальные наименования по индексам, что бы с их уже в дальнейшем самостоятельно обрабатывать.
При поступлении третьего:
1. проверяем успели уже вытащить
2. если нет вытаскиваем по индексам все значения, которых должно быть на 3 с лишним порядка меньше чем в базе.

Кажется нормальное решение , на смотря на то что придумал всё с ходу.
Что касается пэйджинга - я просто не знаю что это.
__________________
Amazon Graffiti - монетизация страниц в Facebook
Venya Tolinov вне форума  
Старый 08.06.2012, 08:41   #3
somebody_
Senior Member
 
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
Отправить сообщение для somebody_ с помощью Telegram
По умолчанию

Вот что то примеро похожее ...
Цитата:
Сходу пишу что в голову пришло, сделать таблицы:
(`первый символ`, `20 готовых подсказок`) ~ 50-100 позиций (зависит от фактического набора символов и учёта регистра)
(`первые два`, `20 готовых подсказок`, `список индексов`), ~ до 10 000 позиций.
(`первые три`, `список индексов`) ~ до 1 000 000 позиций.
Третию возможно тоже имеет смысл делать, если "наименование" более 2к или база будет расти.
это вообще полный финиш и утопия ....

Делать в бд запросы на поиск первых 1 - 2 символов смысла нету будет грузить БД ... ну а дальше кажеться все понятно, ajax подхватывает данные отправляет на сервер -> запрос в БД -> обратно ajax'у .... если что пиши спрашивай ...

а зачем пейджинг в в результатах выпадающего списка ?
__________________
Пилю под Wordpress на php, html5, css3, jquery, since 2008 - wpmastering.pro
somebody_ вне форума  
Старый 08.06.2012, 09:53   #4
Venya Tolinov
Senior Member
 
Аватар для Venya Tolinov
 
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
Отправить сообщение для Venya Tolinov с помощью Skype™
По умолчанию

Цитата:
Сообщение от somebody_ Посмотреть сообщение
Вот что то примеро похожее ...
Давай для начала не путать клиентскую часть и серверную. В этом примере сказано только как клиент сделать, а сервер там как бы в вакууме.

Цитата:
Сообщение от somebody_ Посмотреть сообщение
бла-бла-бла ... ну а дальше кажеться все понятно,
всё понятно, somebody_

Замечу базу это не грузит а разгружает, т.к. работает как кэш. Поиск по совпадению в значении 2кб, или полное соответствие в 2 или 3 байтах - почувствуй разницу. А про первую таблицу я вообще молчу, т.к. её размер 100 строк, по 20 подсказок в каждой строке.
__________________
Amazon Graffiti - монетизация страниц в Facebook
Venya Tolinov вне форума  
Старый 08.06.2012, 09:56   #5
Drunk Monk
Je suis moine ivre
 
Аватар для Drunk Monk
 
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
По умолчанию

Про LIKE вы, наверное, не слышали
Drunk Monk вне форума  
Старый 08.06.2012, 10:00   #6
Venya Tolinov
Senior Member
 
Аватар для Venya Tolinov
 
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
Отправить сообщение для Venya Tolinov с помощью Skype™
По умолчанию

Цитата:
Сообщение от Drunk Monk Посмотреть сообщение
Про LIKE вы, наверное, не слышали
"Поиск по совпадению" = LIKE
P.S. "Производительность" - неа, не слышал. Три дополнительные таблицы со вспомогательными индексами, просто так создаются.
__________________
Amazon Graffiti - монетизация страниц в Facebook

Последний раз редактировалось Venya Tolinov; 08.06.2012 в 10:09.
Venya Tolinov вне форума  
Старый 08.06.2012, 10:50   #7
somebody_
Senior Member
 
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
Отправить сообщение для somebody_ с помощью Telegram
По умолчанию

Цитата:
100,000 наименований.
можно LIKE ом делать с лимитом ... и нормик будет ... хотя согласен LIKE не желательно использовать когда много данных ... будет долго выполняться ... но думаю с таким колличеством как у ТС + оптимизированный сервак, будет норм ...

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

ну конешно все зависит от структуры данных в БД у ТС ...
__________________
Пилю под Wordpress на php, html5, css3, jquery, since 2008 - wpmastering.pro
somebody_ вне форума  
Старый 08.06.2012, 10:57   #8
somebody_
Senior Member
 
Регистрация: 05.09.2008
Сообщений: 606
Бабло: $124350
Отправить сообщение для somebody_ с помощью Telegram
По умолчанию

Вот пример на стороне сервера ... выпадающий поиск по музыкальному сайту ...

Код:
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 так более наглядно на строне сервера ?
__________________
Пилю под Wordpress на php, html5, css3, jquery, since 2008 - wpmastering.pro
somebody_ вне форума  
Старый 08.06.2012, 11:57   #9
Venya Tolinov
Senior Member
 
Аватар для Venya Tolinov
 
Регистрация: 24.11.2010
Сообщений: 229
Бабло: $52860
Отправить сообщение для Venya Tolinov с помощью Skype™
По умолчанию

somebody_
Тебе про "живой поиск" - ты, не у меня вооо-от такая рыба, тебе про базу а ты - не у меня вооооо-ооот такая рыба.
Если бы ТС не знал как запрос с лайком сделать то он наверное бы так и спросил, а если бы у него были вопросы с клиентской частью, но про mysql в вопросе не упоминал. А если ему нужно было просто кондовое решение - то здесь да, ваша рыба съедобна.

P.S.: Я новичок на этом форуме, хоть и "давно" зарегистрирован, поэтому я не знаю какие запросы у авторов тем бывают. После прочитанного не претендую на использовании моего решения. *peace*
__________________
Amazon Graffiti - монетизация страниц в Facebook
Venya Tolinov вне форума  
Старый 08.06.2012, 13:46   #10
Сунь-Цзы
Ебланнед
 
Регистрация: 24.05.2012
Сообщений: 47
Бабло: $12985
ТС -->
автор темы ТС По умолчанию

Мужчины не ссорьтесь
База 100,000 наименований товаров.
Живой поиск имеется ввиду как подсказки у Гугла (которые нынче очень модно парсить ).





Пэйджинг имелось ввиду что вывод результатов поиска ,будет разбит на страницы,по 10 результатов на каждую.
С кнопочками назад вперед ,короче стандарт.





Вот здесь нашел ,но их там очень много вариантов.
Но там опять же не прикручен paging.
И вопрос ,что делать с теми юзерами кто не поддерживает javascript. (или пох?)
Мой программист скурился маленько.
Месяц уже в кумаре ,поэтому говорить с ним о чем то бестолку.
__________________
Человек формирует намерение совершить то, что он намерен совершить,
Просто за счет того, что он намеревается это совершить.
Сунь-Цзы вне форума