Найдите популярные обсуждения в вашем сообществе с сортировкой «Горячие темы»

Следить за контентом в активных сообществах может быть непросто. Как убедиться, что вы читаете именно то, что больше всего откликается вашим участникам, помимо чтения всего, что создано в вашем сообществе?

Представляем Hot — новейший вариант сортировки тем, который помогает обнаружить то, что сейчас популярно в вашем сообществе, основываясь на недавних лайках и оживленных обсуждениях. Представьте это как надежный фильтр Latest, но чуть умнее: Hot помогает находить контент, который является как свежим, так и резонирующим с участниками вашего сообщества.

Как работает сортировка Hot?

Алгоритм сортировки Hot сочетает общую популярность (на основе лайков, реакций или комментариев) темы с момента её создания и её недавнюю популярность, основанную на том, как участники взаимодействуют с темой. Это означает, что Hot выводит на поверхность как новые, активно обсуждаемые темы, так и старые, но популярные. Сортировка Hot идеальна для участников крупных активных сообществ, которые хотят найти сейчас трендовые обсуждения, в которых они хотели бы принять участие.

Чем она отличается от Top?

В отличие от сортировки Hot, которая учитывает комбинацию общей и недавней популярности, сортировка Top учитывает только общую популярность за выбранный период времени (например, неделю, месяц и т. д.). Top наиболее полезен, когда вы отсутствовали в сообществе в течение длительного времени и хотите ознакомиться с тем, что произошло.

Как включить сортировку Hot в моем сообществе?

Если вы хотите использовать сортировку Hot в своем сообществе, перейдите в Admin > Settings и отфильтруйте по «top menu». Затем вы можете выбрать hot в выпадающем меню, чтобы добавить его в варианты навигации верхнего меню.

Могу ли я сделать Hot моей главной страницей по умолчанию?

Да! Как администратор, вы можете установить Hot в качестве варианта сортировки по умолчанию в вашем сообществе, как мы сделали это здесь, на Meta. Чтобы настроить это, перейдите в настройку top menu (Admin > Settings > Basic Setup, как показано в предыдущем разделе) и с помощью стрелок переместите hot в начало списка вариантов сортировки.

Как конечный пользователь, вы можете изменить предпочитаемую главную страницу по умолчанию, перейдя в Preferences > Interface и обновив настройку Default Home Page на предпочитаемый вами вариант.

29 лайков

Приведёт ли резкий, значительный и недавний всплеск просмотров устаревшей темы к тому, что она также будет выдвинута на первый план с помощью этой новой опции сортировки? :slight_smile:

8 лайков

Я бы определённо предпочёл, чтобы просмотры учитывались, если это возможно. На моём форуме мы получаем около 100 лайков в неделю, но 2000 просмотров страниц от зарегистрированных пользователей и 7000 анонимных просмотров. (Это иллюстрация небольшого форума.)

8 лайков

Спасибо за обновление, @lindsey и команда.

Мы его включили и будем экспериментировать.

Кстати, долго ли оно «запускается»? Сейчас отображается «нет горячих тем».

С уважением, в нашем активном сообществе прямо сейчас полно горячих тем. :slight_smile:

5 лайков

+1 «На моём форуме нет горячих тем», хотя горячие темы определённо есть.

6 лайков

Нужно обновить Discourse до последней версии

2 лайка

@simon_tomes @dfabulich вы должны видеть горячие темы на своих соответствующих сайтах. Изначально эта функция была скрыта за флагом, который был удалён на прошлой неделе, поэтому вашему экземпляру потребовалось обновление.

10 лайков

Сейчас работает, спасибо.

4 лайка

Я вижу горячие темы. Спасибо, @pmusaraj.

3 лайка

Хм, возможно, стоит не выбирать это представление по умолчанию, по крайней мере, до какого-либо объявления или подготовки? На некоторых форумах пользователи хотят видеть, что нового. Например, они могут хотеть видеть новые запросы или новые поступления. Представление «Новое и популярное» полезно для развлечения или отслеживания популярности, но сразу же создаёт проблему с выводом нового контента на первый план.

6 лайков

Это представление по умолчанию только здесь, на meta-форуме. Мы собираем отзывы о том, как это воспринимается, когда установлено по умолчанию. Мы не уверены, останется ли это долгосрочным представлением по умолчанию для meta или нет.

У нас нет конкретных планов относительно когда и будем ли мы изменять продукт, чтобы установить «горячее» по умолчанию.

12 лайков

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

То есть я гадал, что здесь не так, потому что был полностью уверен, что /latest каким-то образом сломан, и не понимал, что должен получить.

Это меня беспокоило, но не настолько в данный момент.

Нет, я не увидел и не осознал, что моя стартовая страница/главная была изменена на /hot. Теперь я исправил это для себя, это вообще не проблема, но моя слабая сторона в том, что в обсуждениях форума и даже в объявлениях речь идёт именно о том, когда что-то меняется :smirking_face:. А трогать и изменять мои личные настройки, даже если это касается настроек форума по умолчанию, — это именно то, что меня беспокоит.

Возвращаемся к делу.

Я не совсем уверен насчёт раздела «hot», кто и зачем его будет использовать. Конечно, это ещё один вариант, и он ничего не ломает, но, как я вижу это здесь, он довольно близок к /latest, но без… самого последнего.

Давайте попробуем. И… даже если мне он не кажется полезным, кто-то другой может видеть это иначе, и эти два варианта не конфликтуют друг с другом.

Но я задаюсь вопросом… мог бы или мог ли /hot стать рабочим решением для показа случайным посетителям? Но не сломает ли это Google, или поисковик полностью доволен картой сайта?

1 лайк

Всего одна мысль по этому поводу: охват форума Discourse в Wayback Machine Интернет-архива уже немного фрагментарен. Я подозреваю, что установка hot по умолчанию для этого агента или сценария использования может усугубить ситуацию. Или, возможно, улучшить, конечно — потребуется обдумать этот вопрос.

1 лайк

Согласен — это уже подвело меня три раза за прошедший день.

Чтобы избежать поста в стиле «я тоже», я воспользуюсь возможностью отметить, что домашнюю страницу по умолчанию можно изменить в ваших личных настройках. Я только что сделал это, чтобы избежать подвоха в четвёртый раз. https://meta.discourse.org/my/preferences/interface

8 лайков

Я вижу, что кто-то сообщил и повторно сообщил о проблеме с чрезмерным количеством задач Sidekiq, и кроме моего ответа никто не отреагировал. Эта тема сейчас находится примерно на 100-м месте в стандартной сортировке «Hot». Для форума поддержки это не очень хорошо, на мой взгляд.

2 лайка

Стоит проверить, как работает система ранжирования для этой темы, которой уже три дня, но в ней есть два недавних ответа и несколько лайков. Должна ли она всё ещё находиться на такой низкой позиции?

Я считаю, что параметр «популярное» может стать отличным настройкой по умолчанию, предоставляя обзор ключевых тем, что особенно полезно для новых посетителей или пользователей, заходящих редко. Это также актуально для форумов поддержки, поскольку для таких пользователей объявление может быть важнее вопроса поддержки от одного участника.

Для тех, кто хочет оставаться в курсе всех событий и не пропускать ни одной темы, по-прежнему доступна опция «последние». Они даже могут установить её в качестве своей личной домашней страницы. Кроме того, использование настроек «новые», «непрочитанные» и отслеживание тем помогут пользователям быть в курсе интересующих их обсуждений.

3 лайка

Для меня это звучит как несправедливая критика, тема действительно сложная. Множество тем в разделе Support не получают «достаточно» внимания, независимо от того, что вы понимаете под словом «достаточно».

Это эксперимент: ваше неприятие того, что метка «горячее» стоит по умолчанию для мета-раздела, — лишь один из данных. Мы соберём больше.

Что касается алгоритма:

Мы можем настроить гравитацию, чтобы не «опускать» темы так быстро, как это происходит сейчас. Также я могу попробовать придумать способ слегка повысить приоритет тем на основе «последнего ответа».

На данный момент алгоритм выглядит так:

AI-бот объясняет, как работает метка «горячее» ИИ

sam:

DB.exec(<<~SQL, args)
      INSERT INTO topic_hot_scores (
        topic_id,
        score,
        recent_likes,
        recent_posters,
        created_at,
        updated_at
      )
      SELECT
        topics.id,
        0.0,
        0,
        0,
        :now,
        :now

      FROM topics
      LEFT OUTER JOIN topic_hot_scores ON topic_hot_scores.topic_id = topics.id
      WHERE topic_hot_scores.topic_id IS NULL
        AND topics.deleted_at IS NULL
        AND topics.archetype <> :private_message
        AND topics.created_at <= :now
      ORDER BY
        CASE WHEN topics.pinned_at IS NOT NULL THEN 0 ELSE 1 END ASC,
        topics.bumped_at desc
      LIMIT :max
    SQL

    # обновляем недавние показатели для пакета
    DB.exec(<<~SQL, args)
      UPDATE topic_hot_scores thsOrig
      SET
          recent_likes = COALESCE(new_values.likes_count, 0),
          recent_posters = COALESCE(new_values.unique_participants, 0),
          recent_first_bumped_at = COALESCE(new_values.first_bumped_at, ths.recent_first_bumped_at)
      FROM
        topic_hot_scores ths
        LEFT OUTER JOIN
        (
          SELECT
              t.id AS topic_id,
              COUNT(DISTINCT p.user_id) AS unique_participants,
              (
                SELECT COUNT(distinct pa.user_id)
                FROM post_actions pa
                JOIN posts p2 ON p2.id = pa.post_id
                WHERE p2.topic_id = t.id
                  AND p2.post_type = :regular
                  AND p2.deleted_at IS NULL
                  AND p2.user_deleted = false
                  AND pa.post_action_type_id = 2 -- тип действия для «лайка»
                  AND pa.created_at >= :recent_cutoff
                  AND pa.deleted_at IS NULL
              ) AS likes_count,
              MIN(p.created_at) AS first_bumped_at
          FROM
              topics t
          JOIN
              posts p ON t.id = p.topic_id
          WHERE
              p.created_at >= :recent_cutoff
              AND t.archetype <> 'private_message'
              AND t.deleted_at IS NULL
              AND p.deleted_at IS NULL
              AND p.user_deleted = false
              AND t.created_at <= :now
              AND t.bumped_at >= :recent_cutoff
              AND p.created_at < :now
              AND p.created_at >= :recent_cutoff
              AND p.post_type = :regular
          GROUP BY
              t.id
        ) AS new_values
      ON ths.topic_id = new_values.topic_id

      WHERE thsOrig.topic_id = ths.topic_id
    SQL

    # мы можем в итоге обновить 2 размера пакета, это нормально
    # нужно обновить один пакет тем с высокими баллами
    # нужно обновить второй пакет тем, недавно поднятых
    sql = <<~SQL
      WITH topic_ids AS (
        SELECT topic_id FROM (
          SELECT th3.topic_id FROM topic_hot_scores th3
          JOIN topics t3 on t3.id = th3.topic_id
          ORDER BY t3.bumped_at DESC
          LIMIT :max
        ) Y

        UNION ALL

        SELECT topic_id FROM (
          SELECT th2.topic_id FROM topic_hot_scores th2
          ORDER BY th2.score DESC, th2.recent_first_bumped_at DESC NULLS LAST
          LIMIT :max
        ) X
      )
      UPDATE topic_hot_scores ths
      SET score = (
        CASE WHEN topics.created_at > :recent_cutoff
          THEN ths.recent_likes ELSE topics.like_count END
        ) /
        (EXTRACT(EPOCH FROM (:now - topics.created_at)) / 3600 + 2) ^ :gravity
 +
        CASE WHEN ths.recent_first_bumped_at IS NULL THEN 0 ELSE
          (ths.recent_likes + ths.recent_posters - 1) /
          (EXTRACT(EPOCH FROM (:now - recent_first_bumped_at)) / 3600 + 2) ^ :gravity
        END
        ,
        updated_at = :now

      FROM topics
      WHERE topics.id IN (
        SELECT topic_id FROM topic_ids
      ) AND ths.topic_id = topics.id
    SQL

    DB.exec(sql, args)

Тщательно, точно и понятно объясните алгоритм расчёта «горячих» тем.

gpt4_bot:

Алгоритм расчёта «горячих» тем, реализованный в приведённом SQL-скрипте, предназначен для ранжирования тем по их «горячести» — метрике, отражающей, насколько тема вовлекает или популярна в данный момент. Это достигается за счёт учёта таких факторов, как количество недавних лайков и число уникальных участников, а также времени создания и обновления темы. Вот подробное описание процесса:

Начальная вставка

  • Первая часть: Скрипт начинает с вставки новых записей в таблицу topic_hot_scores для тем, у которых ещё нет такой записи. Это делается путём выбора тем, которые не удалены, не являются личными сообщениями и были созданы до текущего момента времени (:now). Начальные баллы устанавливаются равными нулю, без учёта недавних лайков или участников.
  • Условие фильтрации: Скрипт фокусируется на темах, которые либо не закреплены (или закреплены с меньшим приоритетом), и сортирует их по последней активности (поле bumped_at по убыванию).

Обновление недавних показателей

  • Вторая часть: Затем обновляются данные в таблице topic_hot_scores с учётом недавней активности. Это включает:
    • Подсчёт уникальных участников темы с момента отсечки (:recent_cutoff).
    • Подсчёт лайков на сообщениях в теме с момента :recent_cutoff.
    • Временную метку самого раннего сообщения, считающегося «недавним» для каждой темы.
  • Эта часть процесса призвана отразить самые свежие метрики вовлечённости для каждой темы, захватывая любые новые лайки, участников или активность, произошедшие после точки отсечки :recent_cutoff.

Пересчёт баллов на основе «горячести»

  • Третья часть: Наконец, темы пересчитываются на основе обновлённых метрик. Темы сначала фильтруются до набора, включающего:
    • Пакет тем, наиболее недавно поднятых (чтобы свежий контент тоже учитывался).
    • Другой пакет тем с наивысшими текущими баллами (чтобы высоко вовлекающие темы оставались на виду).
  • Расчёт балла «горячести»: Балл «горячести» пересчитывается по следующей формуле:
    1. Для тем, созданных после :recent_cutoff, балл основывается на recent_likes.
    2. В противном случае он основывается на общем like_count с момента создания темы.
    • Это значение делится на время с момента создания (в часах) плюс два, возведённое в степень :gravity — параметра, который определяет, как быстро темы теряют актуальность со временем.

Кроме того, если есть зафиксированная недавняя активность (recent_first_bumped_at не равен NULL), к баллу добавляется вторичный компонент. Этот компонент представляет собой сумму недавних лайков и участников (минус один, чтобы избежать двойного счёта), делённую на время с момента recent_first_bumped_at (опять же в часах) плюс два, также возведённое в степень :gravity.

  • Обновлённый балл сохраняется с текущей временной меткой в поле updated_at.

Вывод: Суть этого алгоритма — приоритизировать темы, которые не только активно обсуждаются (лайки и участники), но и относительно новые. Использование коэффициента затухания (:gravity) обеспечивает, что значимость этих взаимодействий со временем уменьшается, позволяя новым или недавно активным темам выходить на первый план. Сочетание учёта как общей, так и недавней активности позволяет алгоритму балансировать между долгосрочно популярными темами и свежими, вовлекающими обсуждениями.

9 лайков

Мне нравится, насколько эффективно здесь используется ИИ для описания SQL. Это отличный пример применения. :smile:

8 лайков

Извините — я не хотел никого обидеть. Уверен, руководство радо тому, что новая функция завершена, а разработчики — что её выпустили.

Я всё же надеюсь, что останется место для конструктивной критики.

Насколько я понимаю, в качестве примера приводится лента социальных сетей. Не исключено, что можно посмотреть на главную страницу Hacker News. Там идеал заключается в том, чтобы новые темы получали определённую видимость, как и активные и популярные темы. И те, и другие со временем должны уходить на второй план. HN, кажется, справляется с этим хорошо.

Но моё наблюдение таково: форум поддержки — это совсем другое дело по сравнению с витриной или лентой социальных сетей.

Выше вы найдёте идею о том, что сортировка «Горячее» может подойти для новых незарегистрированных посетителей или для результатов поиска. Я вижу в этом смысл.

Однако я остаюсь при мнении, что Meta — это в основном форум поддержки.

Конечно.

С этим, конечно, согласен, но я не думаю, что сортировка «Горячее» решает эту задачу. Закреплённые темы справляются с этим вполне хорошо.

3 лайка