计算 Discourse 中的“热门”主题

:bookmark: 本参考指南解释了 Discourse 中哪些按“热门”筛选的主题被确定为“热门主题”。

:person_raising_hand: 所需用户级别:所有用户

Discourse 站点有一个功能允许用户按“热门”对主题进行排序。本指南解释了这些“热门”主题是如何计算和显示的。

摘要

  • 所有“热门”主题都会被分配一个“热门分数”(Top Score)
  • 分数基于选定时间段内的点赞数、回复数和浏览量
  • “热门分数”最高的主题将显示在列表的最上方

热门分数计算

主题的“热门分数”是使用以下因素计算的:

  1. 浏览量
  2. 第一篇帖子的点赞数
  3. 后续帖子的点赞数
  4. 回复数

计算使用了三个隐藏的站点设置作为乘数(这些设置在管理界面不可见,但可以通过 Rails 控制台或 API 更改):

  • top topics formula log views multiplier(默认值:2
  • top topics formula first post likes multiplier(默认值:0.5
  • top topics formula least likes per post multiplier(默认值:3

计算步骤

通过将以下各项相加来计算每个主题的热门分数:

  1. 每个主题在选定期间的浏览量对数(最小为 1),乘以 log views multiplier
  2. 主题的原始帖子的点赞数,乘以 first post likes multiplier
  3. 以下两者中的较小值:
    • 每篇帖子的平均点赞数(主题总点赞数除以帖子数)
    • least likes per post multiplier 的值
  4. 如果该时间段内帖子少于 10 个,则执行以下计算:
    0 - ((10 - 主题中的帖子数) / 20) * 原始帖子的点赞数
    
    否则,为 10
  5. 主题的帖子数对数(最小为 1)

查看热门主题

您可以在下面的图片中看到 Discourse 站点上“热门主题”的示例:

附加资源

有关更多技术细节,您可以参考:

-- [params]
-- date :start_date = 26 apr 2020
-- date :end_date = 2 may 2020
-- double :log_views_multiplier = 2.0
-- double :first_post_likes_multiplier = 0.5
-- double :least_likes_per_post_multiplier = 3.0

WITH likes AS (
SELECT topic_id, SUM(like_count) AS count
FROM posts
WHERE created_at::date >= :start_date::date 
  AND created_at::date < :end_date::date
  AND deleted_at IS NULL
  AND NOT hidden
  AND post_type = 1
GROUP BY topic_id
),
op_likes AS (
SELECT topic_id, like_count AS count
FROM posts
WHERE created_at::date >= :start_date::date 
  AND created_at::date < :end_date::date
  AND post_number = 1
  AND deleted_at IS NULL
  AND NOT hidden
  AND post_type = 1
),
posts AS (
SELECT topic_id, GREATEST(COUNT(*), 1) AS count
FROM posts
WHERE created_at::date >= :start_date::date 
  AND created_at::date < :end_date::date
  AND deleted_at IS NULL
  AND NOT hidden
  AND post_type = 1
  AND user_id <> 0
GROUP BY topic_id
),
views AS (
SELECT topic_id, COUNT(*) AS count
FROM topic_views
WHERE viewed_at::date >= :start_date::date 
  AND viewed_at::date < :end_date::date
GROUP BY topic_id
),
category_definition_topic_ids AS (
  SELECT COALESCE(topic_id, 0) AS id FROM categories
),
top_topics AS(
SELECT 
topics.id AS topic_id,
topics.title,
topics.user_id, 
posts.count AS date_range_posts,
views.count AS date_range_views,
topics.views AS all_time_views,
topics.bumped_at,
(CASE
 WHEN topics.created_at::date < :start_date::date 
  AND topics.created_at::date >= :end_date::date
 THEN 0
 ELSE log(GREATEST(views.count, 1)) * :log_views_multiplier +
    op_likes.count * :first_post_likes_multiplier +
    CASE WHEN likes.count > 0 AND posts.count > 0
       THEN
        LEAST(likes.count / posts.count, :least_likes_per_post_multiplier)
       ELSE 0
    END +
    CASE WHEN topics.posts_count < 10 THEN
       0 - ((10 - topics.posts_count) / 20) * op_likes.count
    ELSE
       10
    END +
    log(GREATEST(posts.count, 1))
 END) AS score
FROM posts
INNER JOIN views ON posts.topic_id = views.topic_id
INNER JOIN likes ON posts.topic_id = likes.topic_id
INNER JOIN op_likes ON posts.topic_id = op_likes.topic_id
LEFT JOIN topics ON topics.id = posts.topic_id AND topics.deleted_at IS NULL
WHERE topics.deleted_at IS NULL
  AND topics.visible
  AND topics.archetype <> 'private_message'
  AND NOT topics.archived
  AND topics.id NOT IN (SELECT id FROM category_definition_topic_ids)
ORDER BY
  score DESC,
  topics.bumped_at DESC
)

SELECT * FROM top_topics WHERE score > 0
12 个赞

是否可以在此计算中包含“选票”?

这些现在已隐藏,因此您将在站点设置中看不到它们