Масштабируемый полнотекстовый поиск с заказом результатов по каждому пользователю - PullRequest
2 голосов
/ 06 мая 2010

Какие существуют варианты создания масштабируемого полнотекстового поиска с результатами, которые необходимо сортировать для каждого пользователя? Это для PHP / MySQL (также Symfony / Doctrine, если применимо).

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

Возможные решения

Sphinx - Используйте Sphinx для реализации полнотекстового поиска, выполняйте все запросы и сортировку в MySQL. Это кажется многообещающим (и есть плагин Symfony!), Но я не знаю много об этом.

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

Mysql - Нет встроенной поддержки полного текста (InnoDB), поэтому нам пришлось бы использовать LIKE или REGEX, которые не масштабируются.

Ответы [ 2 ]

2 голосов
/ 06 мая 2010

MySQL имеет собственную поддержку FULLTEXT, но только в MyISAM таблицах.

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

Используя SphinxSE (подключаемый MySQL интерфейс к Sphinx), вы можете объединять MySQL таблицы и Sphinx индексы в одном запросе. Для обновления, тем не менее, потребуется внешний сценарий.

Поскольку количество выполненных тренировок, как представляется, часто меняется, сохранение его в Sphinx потребует слишком больших усилий для перестройки индекса.

С помощью SphinxSE вы можете написать запрос, подобный следующему:

SELECT  *
FROM    workouts w
JOIN    user_workouts uw
ON      uw.workout = w.id
WHERE   w.query = 'query query query;filter=user_id,$user_id'
        AND uw.user = $user_id
ORDER BY
        uw.times_performed DESC
0 голосов
/ 06 мая 2010

Я не уверен, почему вы предполагаете, что использование Lucene было бы невероятным. Сотни тренировок на одного пользователя - это не так много данных для обработки.

Попробуйте использовать Solr / Lucene для бэкэнда поиска. Он имеет интерфейс JSON / XML, который будет прекрасно сочетаться с вашим PHP-интерфейсом. Сохраните выполненную пользователем тренировку # в таблице базы данных. Когда будет выполнен запрос, возьмите результаты из Solr, и вы сможете выбрать из таблицы базы данных и использовать PHP-код. Должно быть достаточно быстрым и масштабируемым. С Solr поддерживать ваш индекс очень просто; просто отправляйте запросы на добавление / обновление / удаление на ваш сервер Solr.

...