Подходы к поиску по сайту - PullRequest
0 голосов
/ 24 февраля 2011

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

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

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

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

None found in multimedia

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

Ответы [ 6 ]

4 голосов
/ 24 февраля 2011

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

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

2 голосов
/ 24 февраля 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/).

2 голосов
/ 24 февраля 2011

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

1 голос
/ 24 февраля 2011

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

1 голос
/ 24 февраля 2011

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

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

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

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

1 голос
/ 24 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...