Dies ist ein Referenzhandbuch, das erklärt, wie Themen, die nach „Top“ gefiltert werden, in Discourse zu „Top-Themen“ werden.
Erforderliche Benutzerebene: 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 im ersten Beitrag
- Likes in nachfolgenden Beiträgen
- Anzahl der Antworten
Die Berechnung verwendet drei Website-Einstellungen als Multiplikatoren:
top topics formula log views multipliertop topics formula first post likes multipliertop topics formula least likes per post multiplier
Berechnungsschritte
Berechnen Sie für jedes Thema einen Top-Score, indem Sie Folgendes addieren:
- Die Anzahl der Aufrufe für jedes Thema im ausgewählten Zeitraum, multipliziert mit dem
log views multiplier - Die Anzahl der Likes im ursprünglichen Beitrag des Themas, multipliziert mit dem
first post likes multiplier - Das Kleinere von:
- Die durchschnittliche Anzahl von Likes pro Beitrag (Gesamtzahl der Likes im 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 im ursprünglichen Beitrag-10 - Die Anzahl der Beiträge zum Thema
Top-Themen anzeigen
Ein Beispiel für Top-Themen auf einer Discourse-Website sehen Sie im folgenden Bild:
Zusätzliche Ressourcen
Weitere technische Details finden Sie unter:
- 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 genauen „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

