"Top"-Themen in Discourse berechnen

:bookmark: Dies ist ein Referenzhandbuch, das erklärt, wie Themen, die nach „Top“ gefiltert werden, als „Top-Themen“ in Discourse bestimmt werden.

:person_raising_hand: Erforderlicher Benutzerlevel: Alle Benutzer

Discourse-Websites verfügen über eine Funktion, mit der Benutzer Themen nach „Top“ sortieren können. Dieses Handbuch erklärt, wie diese „Top“-Themen berechnet und angezeigt werden.

Zusammenfassung

  • Allen „Top“-Themen wird ein „Top-Score“ zugewiesen
  • Der Score basiert auf Likes, Antworten und Aufrufen innerhalb eines ausgewählten Zeitraums
  • Themen mit dem höchsten „Top-Score“ erscheinen am Anfang der Liste

Berechnung des Top-Scores

Der „Top-Score“ eines Themas wird anhand der folgenden Faktoren berechnet:

  1. Anzahl der Aufrufe
  2. Likes für den ersten Beitrag
  3. Likes für nachfolgende Beiträge
  4. Anzahl der Antworten

Die Berechnung verwendet drei versteckte Website-Einstellungen als Multiplikatoren (diese sind in der Admin-Einstellungs-UI nicht sichtbar, können aber über die Rails-Konsole oder die API geändert werden):

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

Berechnungsschritte

Berechnen Sie für jedes Thema einen Top-Score, indem Sie Folgendes addieren:

  1. Der Logarithmus der Anzahl der Aufrufe (mindestens 1) für jedes Thema im ausgewählten Zeitraum, multipliziert mit dem log views multiplier
  2. Die Anzahl der Likes für den ursprünglichen Beitrag des Themas, multipliziert mit dem first post likes multiplier
  3. Der kleinere von:
    • Die durchschnittlichen Likes pro Beitrag (Gesamtanzahl der Likes für das Thema geteilt durch die Anzahl der Beiträge)
    • Der Wert des least likes per post multiplier
  4. Wenn der Zeitraum weniger als 10 Beiträge umfasst, führen Sie die folgende Berechnung durch:
    0 - ((10 - Anzahl der Beiträge im Thema) / 20) * Anzahl der Likes für den ursprünglichen Beitrag
    
    Andernfalls 10
  5. Der Logarithmus der Anzahl der Beiträge (mindestens 1) für das Thema

Top-Themen anzeigen

Ein Beispiel für Top-Themen auf einer Discourse-Website sehen Sie im Bild unten:

Zusätzliche Ressourcen

Für detailliertere technische Informationen können Sie sich auf Folgendes beziehen:

-- [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 „Gefällt mir“

Ist es möglich, ‘Stimmen’ in diese Berechnung aufzunehmen?

Diese sind jetzt ausgeblendet, sodass Sie sie nicht in den Site-Einstellungen sehen werden