Подходы к созданию пользовательского поиска по сайту

Я делаю социальный сайт с множеством различных разделов, таких как блоги, галереи, мультимедиа и т. д. И теперь пришло время реализовать функцию поиска. Заказчик отказался от использования поиска Google и настоял на создании пользовательского поиска, в котором результаты будут отображаться для каждого раздела отдельно.

Например, если пользователь вводит «искусство», результат должен отображаться следующим образом:

3 found in blogs
1 ...
2 ...
3 ...

2 found in galleries
1 ...
2 ...

None found in multimedia

Я планирую использовать для этого полнотекстовый поиск MySQL. Итак, вопрос: как мне сделать такой поиск, чтобы он не убил сервер, если очень много записей соответствуют запросу? Я действительно не понимаю, как реализовать пейджинг в этом случае.


person Silver Light    schedule 24.02.2011    source источник


Ответы (6)


Я настоятельно рекомендую НЕ использовать MySQL для полнотекстового поиска, он медленный как при создании индекса, так и при выполнении поиска.

Взгляните на Sphinx или Lucene, которые значительно быстрее, чем MySQL, и довольно легко связываются с приложениями PHP.

person ianaré    schedule 24.02.2011

Вы не убьете сервер mysql такой штукой, даже если ваше приложение огромно (здесь мы говорим о тысячах запросов в секунду), вам просто нужно настроить копию вашего сервера mysql, предназначенного для поиска, вы можете захотеть создайте кеш «результатов популярных ключевых слов», чтобы немного ускорить процесс, но такие устройства, как googlemini, по-прежнему лучше всего подходят для этого ...

person yent    schedule 24.02.2011

Если вы можете запустить контейнер сервлетов Java (например, Tomcat или Jetty), я рекомендую Solr (http://lucene.apache.org/solr/). Он расположен поверх Lucene и очень мощный. Solr был запущен в CNET и используется крупными сайтами, такими как Netflix и Zappos. Stack Overflow использует реализацию Lucene для .NET. Я не знаком со Sphinx, поэтому не могу сказать, чем он отличается от Solr.

Если вы используете Solr, обратите внимание на фасетирование. Это позволяет вам выполнить поиск, а затем подсчитать, сколько документов было в «блогах», «галереях», «мультимедиа» и т. д.

Вот клиент PHP для взаимодействия с Solr (http://code.google.com/p/solr-php-client/).

person Nick Clark    schedule 24.02.2011

Возможно, лучше использовать - sphinx

person azat    schedule 24.02.2011
comment
Определенно более масштабируемый, но, вероятно, не проще. - person Piskvor left the building; 24.02.2011
comment
Его очень легко установить и настроить, а также хорошая документация. - person azat; 24.02.2011

Я делал это раньше на некоторых сайтах, которые я создал. Что я сделал, так это выполнил один запрос к каждому модулю, чтобы найти результаты. То, что вы хотите сделать, это запустить запрос mysql, а затем выбрать строки в цикле while, а не использовать выборку всех. Это гарантирует, что вы не будете чрезмерно потреблять память.

например: while($row = mysql_fetch_array($result)){ echo $row['item_name']; }

Скорее всего, вы обнаружите, что MySQL может обрабатывать гораздо более крупные поисковые запросы, чем вы думаете.

Разбивку на страницы лучше всего выполнять с помощью класса пейджинга, например, от code igniter или подобного. Вы используете веб-фреймворк?

person Jason    schedule 24.02.2011

Да, Sphinx или Lucene, оба хороши и значительно быстрее, чем MySQL, и довольно легко связываются с приложениями PHP.

person somil007    schedule 24.02.2011