Вы упомянули, что делаете это в SQL-запросе, поэтому я приведу в нем примеры.
Если у вас есть таблица / представление Pages
, примерно так
Pages
-----
page_id:int
views:int - indexed
comments:int - indexed
Тогда вы можете заказать их, написав
SELECT * FROM Pages
ORDER BY
(0.3+LOG10(10+views)/LOG10(10+(SELECT MAX(views) FROM Pages))) +
(0.7+LOG10(10+comments)/LOG10(10+(SELECT MAX(comments) FROM Pages)))
Я сознательно выбрал неравный вес между просмотрами и комментариями. Проблема, которая может возникнуть при сохранении равного веса просмотров / комментариев, заключается в том, что рейтинг становится самореализующимся пророчеством - страница возвращается вверху списка, поэтому ее посещают чаще и, следовательно, получают больше баллов, поэтому она отображается в конце списка, и его посещают чаще, и он получает больше очков .... Повышение веса комментариев означает, что они требуют реальных усилий и проявляют реальный интерес.
Приведенная выше формула даст вам рейтинг на основе статистики за все время. Таким образом, статье, которая набрала такое же количество просмотров / комментариев за последнюю неделю, как и другая статья, собранная в прошлом году, получит такой же приоритет. Возможно, имеет смысл повторять формулу, каждый раз указывая диапазон дат и отдавая предпочтение страницам с более высокой активностью, например
0.3*(score for views/comments today) - live data
0.3*(score for views/comments in the last week)
0.25*(score for views/comments in the last month)
0.15*(score for all views/comments, all time)
Это гарантирует, что «горячим» страницам будет отдан более высокий приоритет, чем страницам с аналогичной оценкой, которые в последнее время не претерпевают особых действий. Все значения, кроме сегодняшних оценок, могут быть сохранены в таблицах с помощью запланированных хранимых процедур, чтобы базе данных не приходилось собирать много комментариев / статистики просмотра. Только сегодняшняя статистика вычисляется "вживую". Сделав еще один шаг вперед, сама формула ранжирования может быть вычислена и сохранена для исторических данных с помощью хранимой процедуры, запускаемой ежедневно.
РЕДАКТИРОВАТЬ: Чтобы получить строгий диапазон от 0,1 до 1,0, вы должны мотивировать формулу следующим образом. Но я подчеркиваю - это только добавит накладных расходов и необязательно - абсолютные значения приоритета не важны - только их относительные значения по отношению к другим URL-адресам. Поисковая система использует их, чтобы ответить на вопрос, является ли URL-адрес A более важным / релевантным, чем URL-адрес B? Он делает это путем сравнения их приоритетов - какой из них является наибольшим, а не их абсолютных значений.
// ненормализовано - x - это некоторый идентификатор страницы un (x) = 0,3 * журнал (просмотры (x) +10) / журнал (10 + maxViews ()) + 0,7 * журнал (комментарии (x) +10) / журнал (10 + maxComments ()) // исходная формула (теперь в псевдокоде)
Максимальное значение будет 1.0, минимальное будет начинаться с 1.0 и будет уменьшаться по мере появления большего количества просмотров / комментариев.
мы определяем un (0) как минимальное значение, т.е. (где просмотры (x) и комментарии (x) равны 0 в приведенной выше формуле)
Чтобы получить нормализованную формулу от 0,1 до 1,0, вы затем вычисляете n (x), нормализованный приоритет для страницы x
.
(1.0-un(x)) * (un(0)-0.1)
n(x) = un(x) - ------------------------- when un(0) != 1.0
1.0-un(0)
= 0.1 otherwise.
person
mdma
schedule
01.06.2010
W1 * nViews + W2 * nComments
и отсортируйте по ней. Играйте сW1
иW2
, пока не получите заказ, который вас устраивает. - person j_random_hacker   schedule 27.05.2010m
просмотров (или комментариев), а затем вы можете для каждой страницы разделить количество просмотров (или комментариев) наm
. Это даст число от 0 до 1, а самый важный сайт (т.е. большинство просмотров или комментариев) будет иметь приоритет 1. - person phimuemue   schedule 31.05.20101.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0
. проблема в том, что мне нужно сделать это в SQL-запросе, а строки даже не упорядочены по этому значению. - person stacker   schedule 31.05.2010