Вычисление индекса, который учитывает счет и дату в хранилище данных Google App Engine

Я работаю над сайтом на основе Google App Engine (python), который позволяет генерировать пользовательский контент и голосовать (нравится / не нравится) за этот контент.

Наш дизайнер довольно смутно определил, что на первой странице должен быть баланс между недавним контентом и популярным контентом, вероятно, с предположением, что они просто создают значение оценки, которое взвешивает "нравится" или "не нравится" по сравнению со временем с момента создания. В конечном счете, цели заключаются в том, что (1) плохой контент отфильтровывается довольно быстро, (2) контент, который продолжает оставаться популярным, остается дольше, и (3) новый контент имеет шанс остаться достаточно долго, чтобы получить достаточно голосов, чтобы определить, его хорошо или плохо.

Я могу легко вычислить оценку, основанную на симпатиях / антипатиях. Но включение фактора времени для получения единой оценки, которая может быть проиндексирована, не представляется возможным. По сути, мне нужно было бы ежедневно переиндексировать весь контент, чтобы скорректировать его оценку, что кажется чрезмерно дорогостоящим, когда мы получаем сколько-нибудь значительное количество контента. Итак, я в недоумении для потенциальных решений.

Я также предложил кое-что, где мы указываем время (все время, ежедневно, еженедельно), но он говорит, что пользователи вряд ли будут смотреть на вкладки, кроме представления по умолчанию. Кроме того, если бы я фильтровал по прошлой неделе, мне нужно было бы сортировать по времени, и тогда вторичная сортировка популярности была бы по существу бессмысленной, поскольку время подачи заявок было бы практически уникальным.

Какие-нибудь предложения относительно решений, которые я мог бы пропустить?

Может ли что-то вроде Google Prediction API или BigQuery справиться с этим лучше?

1 ответ

Решение

Такую систему часто называют "предательством", и есть несколько способов сделать это. Один из способов состоит в том, чтобы со временем голоса "затухали"; Я реализовал это в прошлом на App Engine, сохраняя текущий счет и последнее обновление; любой голос применяет экспоненциальный спад к баллу, основанный на времени последнего обновления, перед сохранением обоих, и фоновый процесс запускается несколько раз в день, чтобы обновить балл и время затухания любых сообщений, которые не получили голосов за некоторое время., Таким образом, оценка сообщения всегда стремится к 0, если она не получает постоянно голосов.

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