Calcolo degli argomenti "Top" in Discourse

:bookmark: Questa è una guida di riferimento che spiega come gli argomenti filtrati per "Top" vengono determinati come "Argomenti Principali" in Discourse.

:person_raising_hand: 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:

  1. Numero di visualizzazioni
  2. Mi piace sul primo post
  3. Mi piace sui post successivi
  4. Numero di risposte

Il calcolo utilizza tre impostazioni del sito come moltiplicatori:

Passaggi di calcolo

Calcola un punteggio top per ogni argomento sommando quanto segue:

  1. Il numero di visualizzazioni per ciascun argomento nel periodo selezionato moltiplicato per il log views multiplier
  2. Il numero di Mi piace sul post originale dell’argomento moltiplicato per il first post likes multiplier
  3. 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
  4. Se il periodo ha meno di 10 post, esegui il seguente calcolo:
    0 - ((10 - numero di post nell'argomento) / 20) * numero di Mi piace sul post originale
    
    Altrimenti, -10
  5. 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
    
12 Mi Piace

È possibile includere i ‘voti’ in questo calcolo?

Queste sono ora nascoste, quindi non le vedrai nelle impostazioni del sito