Questa è una guida di riferimento che spiega come gli argomenti filtrati per "Top" vengono determinati come "Argomenti Principali" in Discourse.
Livello utente richiesto: Tutti gli utenti
I siti Discourse hanno una funzionalità che consente agli utenti di ordinare gli argomenti per "Top". Questa guida spiega come questi argomenti "Top" vengono calcolati e visualizzati.
Riepilogo
- A tutti gli argomenti "Top" viene assegnato un "Punteggio Top"
- Il punteggio si basa su Mi piace, risposte e visualizzazioni in un periodo di tempo selezionato
- Gli argomenti con il "Punteggio Top" più alto appaiono in cima all’elenco
Calcolo del Punteggio Top
Il "Punteggio Top" per un argomento viene calcolato utilizzando i seguenti fattori:
- Numero di visualizzazioni
- Mi piace sul primo post
- Mi piace sui post successivi
- Numero di risposte
Il calcolo utilizza tre impostazioni del sito come moltiplicatori:
top topics formula log views multipliertop topics formula first post likes multipliertop topics formula least likes per post multiplier
Passaggi di calcolo
Calcola un punteggio top per ogni argomento sommando quanto segue:
- Il numero di visualizzazioni per ciascun argomento nel periodo selezionato moltiplicato per il
log views multiplier - Il numero di Mi piace sul post originale dell’argomento moltiplicato per il
first post likes multiplier - Il minore tra:
- La media dei Mi piace per post (Mi piace totali sull’argomento divisi per il numero di post)
- Il valore
least likes per post multiplier
- Se il periodo ha meno di 10 post, esegui il seguente calcolo:
Altrimenti,0 - ((10 - numero di post nell'argomento) / 20) * numero di Mi piace sul post originale-10 - Il numero di post sull’argomento
Visualizzazione degli Argomenti Principali
Puoi vedere un esempio di Argomenti Principali su un sito Discourse nell’immagine qui sotto:
Risorse aggiuntive
Per maggiori dettagli tecnici, puoi fare riferimento a:
- Il codice sorgente Ruby per il calcolo top: discourse/app/models/top_topic.rb at main · discourse/discourse · GitHub
- Questa query Data Explorer per vedere il "Punteggio Top" esatto per ciascun argomento:
-- [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

