Популярность, Как заставить новые хиты считать больше, чем старые? - PullRequest
4 голосов
/ 20 сентября 2010

Каждый продукт product_date_added, который представляет собой поле Date, содержит дату, когда он был добавлен.У них также есть поле product_views, которое представляет собой поле int, в котором указано, сколько раз продукт был просмотрен.

Чтобы отобразить продукты по популярности, я использую алгоритм для расчета количества обращений в день к продукту.,

SELECT 
    AVG(product_views / DATEDIFF(NOW(), product_date_added)) as avg_hits
    , product_table.* 
FROM product_table
WHERE product_available = "yes" 
GROUP BY product_id
ORDER BY avg_hits DESC

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

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

Каков наилучший способ создать алгоритм популярности, подобный тому, о котором просит мой босс?

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

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Вы не должны (как таковые) сохранять дату каждого просмотра. Вместо этого вы можете хранить до 366 строк на элемент в таблице со столбцами: product_id, day_of_year, count. Каждый день запускайте задачу, чтобы обнулить все показатели за год назад. Если вы не возражаете против денормализованных данных, эта задача может также обновить поле «count» в самом элементе для быстрого поиска, чтобы ваш запрос не нуждался в изменении. product_views просто становится product_views_in_the_last_year. Временной интервал в 1 день является произвольным - я сомневаюсь, что вы заботитесь о том, что популярность основана на интервале ровно в 1 год, поэтому я ожидаю, что это может быть час, неделя или две недели, в зависимости от того, сколько ведер у вас ' готовы иметь дело.

Альтернативной схемой может быть использование экспоненциального затухания. Превратите поле счетчика в десятичный тип. Один раз в день уменьшайте количество каждого предмета на фиксированный процент (менее 1%, более 0,1%), чтобы при более недавнем попадании он имел больший «вес». Таким образом, старая популярность никогда не умирает полностью, но хиты прошлого года мало что дадут. Кстати, эквивалент этой схеме - оставить код в том виде, как он есть, но при этом убедиться, что ваш сайт в целом экспоненциально становится все более популярным со временем; -)

Что касается того, чтобы не начинать с нуля - возможно, сразу же уменьшите количество каждого предмета, как разовое действие, на пропорцию, которая зависит от возраста предмета. В целом можно ожидать, что старые объекты имеют более старые представления и, следовательно, переоценены по текущей схеме. Это не надежно, потому что, возможно, некоторые старые вещи недавно получили много хитов. Вы могли бы определить эти элементы, просмотрев последние журналы веб-сервера или потратив неделю или месяц на подсчет посещений, прежде чем делать одноразовое сокращение. Даже без этого, если есть фундаментальная причина их популярности (не только потому, что в настоящее время они занимают высокие позиции в ваших рейтингах и, следовательно, получают трафик от людей, просматривающих ваш «самый популярный» график), то, надеюсь, они восстановятся с течением времени. .

1 голос
/ 21 сентября 2010

Возможно, вы захотите проверить это сообщение в блоге . Он нацелен на App Engine, но методика общая. Основной подход заключается в том, чтобы иметь популярность, которая уменьшается в геометрической прогрессии и увеличивается каждый раз, когда вы регистрируете голосование / загрузку / что угодно.

...