Dies ist ein Referenzhandbuch, das erklärt, wie Themen, die nach „Top“ gefiltert werden, als „Top-Themen“ in Discourse bestimmt werden.
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:
- Anzahl der Aufrufe
- Likes für den ersten Beitrag
- Likes für nachfolgende Beiträge
- 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:
- Der Logarithmus der Anzahl der Aufrufe (mindestens 1) für jedes Thema im ausgewählten Zeitraum, multipliziert mit dem
log views multiplier - Die Anzahl der Likes für den ursprünglichen Beitrag des Themas, multipliziert mit dem
first post likes multiplier - 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
- Wenn der Zeitraum weniger als 10 Beiträge umfasst, führen Sie die folgende Berechnung durch:
Andernfalls0 - ((10 - Anzahl der Beiträge im Thema) / 20) * Anzahl der Likes für den ursprünglichen Beitrag10 - 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:
- Der Ruby-Quellcode für die Top-Berechnung: discourse/app/models/top_topic.rb at main · discourse/discourse · GitHub
- Diese Data Explorer-Abfrage, um den exakten „Top-Score“ für jedes Thema anzuzeigen:
-- [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
