#php #jquery #mysql #json
#php #jquery #mysql #json
Вопрос:
Привет, я разрабатываю веб-сайт социальной сети и нуждаюсь в предложении. Я использую фреймворк codeignitor, php в качестве основного языка и jQuery в качестве скрипта на стороне клиента.
Теперь я хочу реализовать функцию поиска пользователей на веб-сайте, где пользователь может искать других пользователей.
Если я использую разбивку на страницы с помощью php, это немного медленно, а производительность невысока, и даже если база данных будет огромной, она будет медленнее.
итак, что я попробовал, я сделал запрос первых 1000 человек и закодировал с помощью json и показывал первые 10 результатов одновременно, используя этот плагин http://www.stephenrhoades.com/?p=8
Есть ли кто-нибудь, кто может помочь мне, чему мне нужно следовать здесь, включая технологии, советы, запросы, базу данных mysql и т. Д.
Вот моя текущая функция в модели
function search_user($cntry,$male,$female,$age_min,$age_max){
$this->db->select('user_profiles.user_id,user_profiles.first_name,
user_profiles.birthday,user_profiles.gender,user_profiles.picture,
user_profiles.last_active,location.city,location.country');
$this->db->from('user_profiles');
$this->db->join('location', 'user_profiles.user_id = location.user_id');
$this->db->limit(800);
// Search condition :::: Country
if($cntry){
$this->db->like('location.country',$cntry, 'both');
}
// Search condition :::: Male or Female
if($male==1 amp;amp; $female==0) { $g='Male'; $this->db->like('user_profiles.gender',$g, 'both'); }
if($male==0 amp;amp; $female==1) { $g='Female'; $this->db->like('user_profiles.gender',$g, 'both'); }
// Search condition :::: Age range
if($age_min amp;amp; !$age_max){
$this->db->where('(YEAR(NOW())-YEAR(user_profiles.birthday)) >= ', $age_min);
}
if($age_min amp;amp; $age_max){
$this->db->where('(YEAR(NOW())-YEAR(user_profiles.birthday)) >= ', $age_min);
$this->db->where('(YEAR(NOW())-YEAR(user_profiles.birthday)) <= ', $age_max);
}
$this->db->order_by("user_profiles.last_active", "desc");
$query = $this->db->get();
$data=array();
foreach ($query->result() as $row){
$row->last_active=$this->online_status($row->last_active);
$row->birthday=$this->birthday($row->birthday);
$data[]=$row;
}
if ($query->num_rows() > 0)
{
return $data;
}
else
{
$data = array(
'result' =>'404'
);
return $data;
}
}
Заранее спасибо
Комментарии:
1. требует включения минимального количества символов и устанавливает ограничение на запрос!
2. Если я ограничу запрос с помощью этого плагина, например, 50, он не покажет больше результатов, чем 50, в качестве результата поиска.
Ответ №1:
Существует множество факторов, которые могут привести к замедлению этого процесса. Это вопросы, которые нам нужно будет решить:
- Какие столбцы вы ищете в своей базе данных?
- Индексируются ли эти столбцы?
- Как выглядит ваш запрос? Вы возвращаете только необходимые столбцы?
- Как быстро вы хотите показывать результаты? Сразу после ввода пользователем или после того, как они нажмут «поиск»?
- Как вы возвращаете результаты?
- Как вы отображаете результаты?
Как правило, вы можете выполнять поиск в ОЧЕНЬ больших наборах данных за считанные миллисекунды, поэтому я сомневаюсь, что проблема в базе данных, если у вас все настроено правильно.
Хорошо, со всем сказанным…
Если у вас ОЧЕНЬ большая социальная сеть, я бы рекомендовал реализовать что-то вроде Zend Search Lucene. Это поисковый индекс, который может быть довольно легко реализован в CodeIgniter:
Вы можете добавлять своих пользователей, их данные профиля, сообщения, комментарии и т. Д. В индекс и выполнять поиск с помощью мощного языка обработки запросов и возвращать результаты очень быстро и в любом формате, который вы пожелаете. Это очень легко превратить в «живой» поиск с помощью ajax и json.
Комментарии:
1. Привет, Сваткинс, спасибо, что ответил на мой вопрос. Эти советы действительно полезны для меня. Вот ответы на ваши вопросы… Я ищу user_id, имя пользователя, first_name, картинку, день рождения, пол и online_status. И, нет, моя таблица не индексируется, я использую только user_id в качестве первичного ключа. Я возвращаю только указанные столбцы. Я хочу, чтобы поиск был повторен сразу же, как только пользователь перейдет на страницу, а затем onclick и onchange вводят данные. Мне нужны выходные результаты для отображения профиля и основной информации о пользователях.
2. Можете ли вы предложить свой запрос? Используете ли вы mysql?
3. Я редактирую запрос в своем главном вопросе. А вот живой сайт, где вы можете отслеживать производительность, если у вас есть время, я буду признателен meetm8.com Пользователь: demo@demo.com и пропуск: 12345
4. Не могли бы вы включить профилирование — $this-> output-> enable_profiler(TRUE); в контроллере
5. Хорошо, извините за задержку. Я только что взглянул на ваши страницы. Я не думаю, что здесь есть большая проблема. Ваш плагин jquery использует результаты поиска по meetm8.com/search/search_user разбить результаты на страницы (это действительно быстро — так что никаких проблем нет). Я думаю, что ваш запрос довольно хорош, хотя я бы, вероятно, немного оптимизировал его (использование
like
для мужчин / женщин кажется излишним). В любом случае, имея всего несколько вариантов возможностей поиска, я думаю, вам было бы лучше кэшировать результаты json в файл и возвращать содержимое этих файлов на основе выбора пользователя.