2012-08-16 3 views
1

Это обобщение вопроса, с которым я боролся некоторое время. Мое дело в том, что у меня есть сайт WordPress с несколькими типами сообщений (например, статьи, сообщения в блогах, продукты и т. Д.). Как принято в наши дни, я хочу отображать результаты поиска по каждому типу сообщения в отдельных категориях.Поиск нескольких типов содержимого

Проблема заключается в структурировании поиска. Должен ли я запускать отдельный запрос базы данных для каждого типа сообщения, или я должен запустить один большой запрос и разделить все через PHP? Я склоняюсь к последнему, но проблема, с которой я сталкиваюсь, - это разбиение на страницы. Я бы, вероятно, не должен был задавать LIMIT по запросу, потому что если бы у меня было несколько совпадений с одним типом сообщения, поиск не возвращал бы никаких результатов из других типов сообщений.

Итак, исходя из соображений производительности и общих рекомендаций, лучше ли иметь один большой запрос без предложения LIMIT или запускать несколько запросов для каждого поиска?

Примечание: Это похоже на a question. Я спросил на веб-сайте WordPress Stack Exchange некоторое время назад. Тогда я принял решение с несколькими запросами, но я все еще не уверен в этом.

+0

Почему не решение нескольких запросов? Это лучше с точки зрения пользователя: я не хочу оплачивать стоимость большого поиска при поиске только одного типа данных. Это лучше с точки зрения кода, так как проще искать такие поиски самостоятельно. Это чище и легче. – inigomedina

+0

Я обязательно разрешу пользователям сузить свой поиск до определенного типа контента, если они захотят, и в этом случае я обязательно буду фильтровать в базе данных. В этом вопросе я сосредоточен на том, что пользователи не указали тип содержимого. Я не уверен, что это будет стоить больше, чтобы запустить большой поиск, который фильтруется через PHP или несколько небольших поисков. Имеет ли это смысл? –

ответ

1

По моему опыту, как правило, лучше попросить базу данных сделать как можно меньше работы, и PHP делает большую часть тяжелого подъема. Это обычно быстрее.

Итак, я бы попытался выполнить два очень простых запроса (по одному для каждой таблицы), а затем слияние/сортировку их с помощью PHP-кода.

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

Но если вы столкнулись с ограничениями производительности PHP, то я подозреваю, что все, что вы делаете в MySQL, на самом деле будет еще медленнее, и вам нужно будет изменить структуру базы данных, чтобы получить хорошую производительность. Один из способов сделать это - сохранить существующую структуру таблицы, но иметь третью таблицу, которая содержит повторяющиеся данные из всех таблиц - только для поиска, а также некоторый код, чтобы синхронизировать все.

Например, у нас есть таблица, содержащая все pdf-документы, загруженные пользователями сайта, и у нас есть другая таблица, содержащая каждое слово, которое находится в любом документе, и таблицу ссылок «многие-ко-многим» между этими ,

Всякий раз, когда загружается новый pdf, мы находим в нем каждое слово и вставляем записи в таблицу ссылок. Таким образом, нам никогда не нужно искать в документах PDF, мы только просматриваем индексированные таблицы, которые были структурированы для быстрого поиска.

+0

Спасибо за проницательный ответ. Мне немного любопытно узнать о двух простых запросах, которые вы упомянули. Какова цель каждого из них? –

+0

Ну, у меня бы был такой базовый запрос, как 'select * from wp_posts, где post_title, например,«% foo% »или post_content, например«% foo% »на каждой таблице, а затем объединить их в единый массив результатов и сделать любую другую пост-обработку (например: для wordpress вам нужно «strip_tags()», а затем проверить поиск снова - если поисковый запрос содержался в синтаксисе HTML или CSS, но не в фактическом содержимом сообщения). –

+0

Хороший вызов для запуска результатов через 'strip_tags()' и перепроверки, но человек, который звучит ресурсоемким. Итак, я бы, вероятно, закончил выполнение всего 2 или, возможно, 3 запросов. Я думаю 1 для таблицы 'wp_posts', 1 для таблицы' wp_terms' и, возможно, 1 для таблицы 'wp_postmeta'. Звучит так правильно? –

0

Для поиска такого типа я бы открыл свой разум для индексирования, используя такие решения, как Solr. Вы можете делать много вещей с такими решениями, и они соответствуют очень хорошо математике тем типам пользователей, которые ищут в общем виде.

+0

Это выглядит довольно уверенно. Я не уверен, смогу ли я установить его в моей общей среде хостинга. Спасибо за предложение. –

Смежные вопросы