数据探索器查询:列出“估计阅读时间”最长的主题?

大家好,

是否有可能创建一个数据探索器查询,按“预估阅读时间”列出“前 X 个”主题?

我很想知道在我们的 Discourse 上,哪些主题最耗费阅读时间 :smiley:

(顺便提一下,继 @simon这篇帖子之后,我似乎无法给这篇帖子添加 data-explorer 标签?)

我认为我在该主题中建议的方法需要改进。其中一个问题是,只有 TL3 及以上级别的用户才能在 Meta 上给帖子添加标签。这意味着该网站的大多数用户无法按照我的说明操作。另一个问题是,最终我们会发现带有 data-explorer 标签的帖子中既有未回答的主题,也有已回答的主题。这无助于查询搜索。

抱歉回复晚了。我最近忙于讨论如何在网站上组织数据探索器查询。使用 data-explorer 标签似乎是理想的解决方案,但包含数据探索器查询的主题需要由拥有 TL3 权限的用户进行标记。

我认为类似以下的查询可以为您提供所需的信息:

SELECT
topic_id,
category_id,
SUM(total_msecs_viewed) / 60000  AS estimated_minutes_read
FROM topic_users tu
JOIN topics t ON t.id = tu.topic_id
WHERE t.deleted_at IS NULL
AND t.archetype = 'regular'
GROUP BY tu.topic_id, category_id
ORDER BY estimated_minutes_read DESC
LIMIT 100

查询最后一行中的 LIMIT 100 语句可以根据需要调整或移除,以便返回更多结果。

有趣的是,在 Meta 站点上记录阅读时间最长的主题是 https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045。目前的累计阅读时间为 126048 分钟。

@simon

这个公式对吗?

如果我随机选取四到五个条目,并将此查询中“预计阅读时间”列的结果与主题本身的预计阅读时间进行比较,我得到了两个非常不同的数字?:thinking:

看起来该查询返回的是阅读时间最长的主题,而不是阅读耗时最长的主题?

啊,那或许能解释这个问题。

我猜 total_msecs_viewed 是不是这里不该用的列?

您可以使用用户阅读主题的平均耗时。
在这种情况下,只需将 SUM 函数改为 AVG,结果如下所示:

SELECT
    topic_id,
    category_id,
    AVG(total_msecs_viewed) / 60000  AS estimated_minutes_read
FROM topic_users tu
JOIN topics t ON t.id = tu.topic_id
WHERE t.deleted_at IS NULL
AND t.archetype = 'regular'
GROUP BY tu.topic_id, category_id
ORDER BY estimated_minutes_read DESC
LIMIT 100

感谢你的建议,@michebs,但恐怕那个也完全不对。

几个例子:

查询内容 主题内容
438 61
353 58
335 40
196 24

但这是否意味着,平均一个人需要 438 分钟才能读完那个热门话题?这似乎不太可能。这听起来可能有点傻,但你在 60,000 这个数字里是否漏掉了足够的 0?

编辑: 或者,平均值是否也包含了用户重复阅读某个话题的时间?也就是说,通读一遍需要 61 分钟,但用户实际平均花费在该话题上的时间是 438 分钟。

不过,我现在很想知道“摘要”中的“预计阅读时间”是如何计算的,因为理想情况下,这些数值应该是一致的。即使将估算时间缩小十倍,也只是一个粗略的近似值。:thinking:

是的,完全正确 :blush:

我简单搜索了一下,找到了这个链接:"There are 84 replies with an estimated read time of 0 minutes." - #9 by nbianca

我有点难以解读这些信息,但看起来它使用的是“单词数 × 时间”的估算公式(此外还有一个最小时间值,用于处理像图片这样没有文字的帖子)。

还有一个链接可能暗示了最终值的名称:(不过内容较旧,可能已经变更?)

这些信息可能帮助不大,但我觉得还是分享一下,以防万一。:slightly_smiling_face:

希望你能找到想要的答案。:crossed_fingers:

我再看了一下,它似乎(最简单的形式)是 topic.word_count 乘以“阅读时间字数”管理员设置(默认为 500 字/分钟)。所以我认为这个查询将产生阅读时间最长的前 X 个主题:

-- [params]
-- integer :limit = 10

SELECT t.id as topic_id, (t.word_count)/500+1 AS estimated_read_time
FROM topics t
WHERE t.word_count IS NOT NULL
AND t.archetype = 'regular'
ORDER BY t.word_count DESC
LIMIT :limit

不过,也有另一种选择“4 秒最短”:(帖子数 x 4)/60。这是为了考虑没有字数的图片主题。所以它同时计算两者,并显示较大的那个。但我还没有完全弄清楚如何将其添加进去。:slightly_smiling_face:

不幸的是,我的网站不够大,无法对其进行充分测试。它在小样本测试中似乎有效,但可能需要调整。:slightly_smiling_face:

编辑: 我添加了一个“limit”参数,使其更接近 OP 的规格。:+1:

太棒了,我想他明白了!

@JammyDodger 我运行了你的查询,这里有几张截图供参考。

首先是“前10名”:

果然如此:

:scream: :clap:t2:

有几个数字不太匹配,但非常接近了!

看来我肯定需要弄清楚如何添加照片。:slightly_smiling_face: 我还没有放弃。:crossed_fingers:

我又试了一次。:slightly_smiling_face: 我对此不是100%确定,因为我没有足够大的样本来测试它,但它已经抓取了我的测试主题。:+1:

-- [params]
-- integer :limit = 10

WITH read_time AS (
SELECT t.id as topic_id,
(t.word_count)/500+1 as word_count_time,
(t.posts_count*4)/60+1 as post_count_time
FROM topics t
WHERE t.word_count IS NOT NULL
AND t.archetype = 'regular'
AND t.deleted_at IS NULL
)

SELECT topic_id, CONCAT (CASE WHEN word_count_time > post_count_time THEN word_count_time ELSE post_count_time END, ' min') AS estimated_reading_time
FROM read_time
ORDER BY estimated_reading_time DESC
LIMIT :limit