هذا دليل مرجعي يشرح كيفية تحديد المواضيع التي تم تصفيتها حسب “الأعلى” لتكون “أعلى المواضيع” في Discourse.
مستوى المستخدم المطلوب: جميع المستخدمين
تحتوي مواقع Discourse على ميزة تسمح للمستخدمين بفرز المواضيع حسب “الأعلى”. يشرح هذا الدليل كيفية حساب هذه المواضيع “الأعلى” وعرضها.
ملخص
- يتم تعيين “درجة عليا” لجميع المواضيع “العليا”.
- تعتمد الدرجة على الإعجابات والردود والمشاهدات خلال فترة زمنية محددة.
- تظهر المواضيع ذات “الدرجة العليا” الأعلى في أعلى القائمة.
حساب الدرجة العليا
يتم حساب “الدرجة العليا” للموضوع باستخدام العوامل التالية:
- عدد المشاهدات
- الإعجابات على المنشور الأول
- الإعجابات على المنشورات اللاحقة
- عدد الردود
يستخدم الحساب ثلاثة إعدادات للموقع كعوامل مضاعفة:
top topics formula log views multipliertop topics formula first post likes multipliertop topics formula least likes per post multiplier
خطوات الحساب
احسب درجة عليا لكل موضوع عن طريق إضافة ما يلي:
- عدد المشاهدات لكل موضوع في الفترة المحددة مضروبًا في
log views multiplier. - عدد الإعجابات على المنشور الأصلي للموضوع مضروبًا في
first post likes multiplier. - الأقل من:
- متوسط الإعجابات لكل منشور (إجمالي الإعجابات على الموضوع مقسومًا على عدد المنشورات).
- قيمة
least likes per post multiplier.
- إذا كانت الفترة تحتوي على أقل من 10 منشورات، قم بإجراء الحساب التالي:
بخلاف ذلك،0 - ((10 - عدد المنشورات في الموضوع) / 20) * عدد الإعجابات على المنشور الأصلي-10. - عدد المنشورات في الموضوع.
عرض أعلى المواضيع
يمكنك رؤية مثال لأعلى المواضيع على موقع Discourse في الصورة أدناه:
موارد إضافية
لمزيد من التفاصيل الفنية، يمكنك الرجوع إلى:
- كود مصدر Ruby للحساب الأعلى: discourse/app/models/top_topic.rb at main · discourse/discourse · GitHub
- استعلام Data Explorer هذا لرؤية “الدرجة العليا” الدقيقة لكل موضوع:
-- [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

