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” (Principali). Questa guida spiega come questi argomenti “Principali” vengono calcolati e visualizzati.

Riepilogo

  • A tutti gli argomenti “Principali” viene assegnato un “Punteggio Principale” (Top Score)
  • Il punteggio si basa su mi piace, risposte e visualizzazioni all’interno di un periodo di tempo selezionato
  • Gli argomenti con il “Punteggio Principale” più alto appaiono in cima alla lista

Calcolo del Punteggio Principale

Il “Punteggio Principale” 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 nascoste come moltiplicatori (queste non sono visibili nell’interfaccia delle impostazioni di amministrazione, ma possono essere modificate tramite la console Rails o l’API):

  • top topics formula log views multiplier (impostazione predefinita: 2)
  • top topics formula first post likes multiplier (impostazione predefinita: 0.5)
  • top topics formula least likes per post multiplier (impostazione predefinita: 3)

Passaggi di calcolo

Calcola un punteggio principale per ogni argomento sommando quanto segue:

  1. Il logaritmo del numero di visualizzazioni (minimo 1) per ogni 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 (totale dei mi piace sull’argomento diviso 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 logaritmo del numero di post (minimo 1) sull’argomento

Visualizzazione degli Argomenti Principali

Puoi vedere un esempio di Argomenti Principali su un sito Discourse nell’immagine seguente:

Risorse aggiuntive

Per dettagli più tecnici, puoi fare riferimento a:

-- [params]
-- date :start_date = 26 apr 2020
-- date :end_date = 2 mag 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