Я недавно изучал алгоритмы ранжирования, особенно те, которые используются Reddit и Hacker News. Сами алгоритмы достаточно просты, но я не совсем понимаю, как они используются.
Одна вещь, которую я мог бы сделать, это реализовать алгоритм прямо в SQL, так что каждый раз, когда пользователь переходит на страницу, отображающую ранжированные сообщения, что-то вроде этого будет работать:
SELECT thing1, thing2 FROM table
ORDER BY ranking_algorithm DESC
LIMIT page*20, 20
Есть несколько похожих вопросов по SO, но единственный ответ - поставить алгоритм ранжирования внутри SQL-запроса. Затем нить умирает...
Включение алгоритма в SQL-запрос в меньшем масштабе, но что, если на веб-сайте имеется большое количество пользователей и очень большое количество сообщений? Это означает, что каждый раз, когда любой пользователь открывает страницу, на которой отображаются ранжированные сообщения, этот запрос будет запущен. Это не может быть очень эффективным.
Теперь Reddit и Hacker News не запускают свои алгоритмы ранжирования в виде SQL-запросов, а в python и ark соответственно. Итак, как и когда именно они используются?
Одним из возможных решений является получение всей необходимой информации из каждого сообщения и сохранение ее в некоторой структуре данных на веб-сервере. Затем ранжируйте и сортируйте эту структуру данных.
Каждый раз, когда кто-то открывает страницу, на которой отображаются ранжированные сообщения, вы просто переходите к структуре данных, извлекаете правильный диапазон сообщений и показываете их.
Затем каждые полчаса вы получаете самую последнюю информацию с сервера, оцениваете ее, сортируете и обновляете структуру данных.
Другие менее дорогостоящие запросы, такие как извлечение и отображение всей информации с определенной должности или отображение новейших сообщений (в отличие от наилучшего результата), могут выполняться в SQL каждый раз, когда открывается соответствующая страница.
Преимущество заключается в том, что ваша база данных попадает (для дорогого запроса на ранжирование) только один раз каждые полчаса. Недостатком является то, что вам нужно иметь дубликат большого фрагмента вашей базы данных.