Как используются алгоритмы ранжирования Reddit и Hacker News?
недавно я рассматривал алгоритмы ранжирования, особенно те, которые используются 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 каждый раз при открытии соответствующей страницы.
преимущество в том, что ваша база данных попадает (для дорогостоящего запроса ранжирования) только один раз в полчаса. Недостатком является то, что вам нужно иметь дубликат большой кусок вашей базы данных.
2 ответов
Reddit использует Pyrex, алгоритм сортировки является расширением Python C для повышения производительности.
таким образом, вы можете сделать то же самое в SQL, когда запись обновляется, pex: когда вверх или вниз проголосовали.
псевдокод, который необходимо перевести в синтаксис SQL engine:
function hot(ups, downs, date){
score = ups - downs;
order = log(max(abs(score), 1), 10);
if (score>0){
sign = 1;
} else {
if (score<0){
sign = -1;
} else {
sign = 0;
}
}
td = date - datetime(1970,1,1);
seconds = td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000) - 1134028003;
return round(order + sign * seconds / 45000, 7);
}
таким образом, вы должны сохранить в таблице post взлеты, падения, дату и результат горячей функции. А потом можно сделать сортировку в горячей колонке.
вы можете увидеть Источник Reddit код здесь:http://code.reddit.com/
я реализовал SQL-версию алгоритма ранжирования Reddit для агрегатора видео, например:
SELECT id, title
FROM videos
ORDER BY
LOG10(ABS(cached_votes_total) + 1) * SIGN(cached_votes_total)
+ (UNIX_TIMESTAMP(created_at) / 300000) DESC
LIMIT 50
cached_votes_total обновляется триггером при каждом новом голосовании. Он работает достаточно быстро на нашем текущем сайте, но я планирую добавить столбец значения рейтинга и обновить его с тем же триггером, что и cached_votes_total