Как используются алгоритмы ранжирования 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