Consulta do explorador de dados para listar os tópicos com o "tempo estimado de leitura" mais longo?

Olá a todos,

É possível criar uma consulta no Data Explorer que liste os “top X” tópicos por “tempo estimado de leitura”?

Gostaria muito de saber quais tópicos em nosso Discourse consomem mais tempo para leitura :smiley:

(E, fora do tópico, seguindo esta postagem do @simon, não consigo adicionar a tag data-explorer a esta postagem?)

Acho que a abordagem que sugeri naquele tópico precisa ser aprimorada. Um problema é que apenas usuários com nível TL3 ou superior podem marcar posts no Meta. Isso significa que a maioria dos usuários do site não conseguiria seguir minhas instruções. A outra questão é que acabaremos com tópicos sem resposta e tópicos respondidos ambos com a tag data-explorer. Isso não ajudará muito na busca por consultas.

Desculpe pela resposta tardia. Fiquei envolvido com a questão de como organizar as consultas do Data Explorer no site. Usar a tag data-explorer parece ser a solução ideal, mas tópicos que contêm uma consulta do Data Explorer precisarão ser marcados por um usuário com status TL3.

Acho que algo como a seguinte consulta fornecerá as informações que você procura:

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

A cláusula LIMIT 100 na última linha da consulta pode ser ajustada ou removida se você quiser que mais resultados sejam retornados.

Curiosamente, o tópico com de longe o maior tempo de leitura registrado no Meta é Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso). Atualmente, ele está em 126048 minutos.

Oi @simon

Essa fórmula está correta?

Se eu escolher quatro ou cinco aleatoriamente e comparar o resultado da coluna de tempo estimado de leitura nesta consulta com o tempo estimado de leitura no próprio tópico, estou obtendo dois números muito diferentes? :thinking:

Parece que essa consulta retorna os Tópicos que foram lidos por mais tempo, em vez dos Tópicos que levam mais tempo para serem lidos?

Ah, isso poderia explicar o problema.

Estou supondo que total_msecs_viewed seja a coluna errada para usar aqui?

Você pode usar o tempo médio que os usuários levam para ler o tópico.
Nesse caso, basta alterar a função SUM para AVG, ficando assim:

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

Obrigado pela sugestão @michebs, mas receio que essa também esteja muito longe do objetivo.

Alguns exemplos:

O que a consulta diz O que o tópico diz
438 61
353 58
335 40
196 24

Mas isso significaria que, em média, uma pessoa leva 438 minutos para ler esse tópico principal? Isso parece improvável. Pode parecer bobagem, mas você teve zeros suficientes no 60.000?

Edição: Ou talvez a MÉDIA inclua também todas as releituras de um tópico? Então, uma única leitura seria de 61 minutos, mas, na verdade, os usuários passam em média 438 minutos lá dentro.

Agora, estou bastante curioso para saber como é calculado o Tempo Estimado de Leitura para o Resumo, pois idealmente eles deveriam coincidir. Mesmo reduzindo esses valores por um fator de dez, ainda seria apenas uma estimativa grosseira. :thinking:

Sim, exatamente :blush:

Fiz uma pequena pesquisa e encontrei isso: "There are 84 replies with an estimated read time of 0 minutes." - #9 by nbianca.

Tenho dificuldade em decifrar essas coisas, mas parece que usa um cálculo de contagem de palavras multiplicado por tempo (mais um tempo mínimo para cobrir posts sem palavras, como imagens).

Também havia este outro, que dava uma pista sobre como o valor final pode ser chamado: (embora seja antigo, então pode ter mudado?)

Não é muito útil, com certeza, mas achei que valia a pena compartilhar, só por precaução. :slightly_smiling_face:

Espero que você encontre as respostas que está procurando. :crossed_fingers:

Eu dei outra olhada nisso, e parece (em sua forma mais simples) ser topic.word_count multiplicado pela configuração de administrador ‘read time word count’ (padrão 500 palavras/min). Então, acho que esta consulta produziria os principais X tópicos ‘mais longos para ler’:

-- [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

Embora também haja a alternativa de ‘mínimo de 4 segundos’: (número de posts x 4)/60. Que existe para contabilizar tópicos de fotos sem contagem de palavras. Então, funciona para ambos, e exibe o que for maior. Mas eu ainda não descobri como adicionar isso. :slightly_smiling_face:

Infelizmente, não tenho um site grande o suficiente para testá-lo adequadamente. Pareceu funcionar em uma pequena amostra de teste, mas pode precisar de ajustes. :slightly_smiling_face:

Editar: Adicionei um parâmetro ‘limit’ para aproximá-lo da especificação do OP. :+1:

Por Deus, acho que ele conseguiu!

@JammyDodger Executei sua consulta, aqui estão algumas capturas de tela para referência.

Primeiro, os “top 10”:

E, como esperado:

:scream: :clap:t2:

Existem alguns números que não batem exatamente, mas está muito perto!

Parece que definitivamente preciso descobrir como adicionar a foto. :slightly_smiling_face: Ainda não desisti. :crossed_fingers:

Já tentei de novo. :slightly_smiling_face: Não tenho 100% de certeza sobre este, pois não tenho uma amostra grande o suficiente para testá-lo, mas ele captou meus tópicos de teste. :+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