PHP, MYSQL, JSOn Советы по функциональности быстрого поиска для веб-сайта социальной сети

#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:

http://www.cmjackson.net/2009/02/17/how-to-use-zend_search_lucene-with-the-php-framework-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 в файл и возвращать содержимое этих файлов на основе выбора пользователя.