Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Silver LightОтветов: 6

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

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

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

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

None found in multimedia

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

phpfull-text-search

Ответы

Ответ 1 · рейтинг 4 · ianaré

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

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

Ответ 2 · рейтинг 2 · yent

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

Ответ 3 · рейтинг 2 · Nick Clark

Если вы можете запустить контейнер сервлетов 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/).

Ответ 4 · рейтинг 1 · azat

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

Ответ 5 · рейтинг 1 · Jason

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

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

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

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

Ответ 6 · рейтинг 1 · somil007

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы