حساب المواضيع "الأفضل" في Discourse

:bookmark: هذا دليل مرجعي يشرح كيف يتم تحديد المواضيع التي تم تصفيتها بواسطة “الأعلى” على أنها “أفضل المواضيع” في Discourse.

:person_raising_hand: مستوى المستخدم المطلوب: جميع المستخدمين

تحتوي مواقع Discourse على ميزة تسمح للمستخدمين بفرز المواضيع حسب “الأعلى”. يشرح هذا الدليل كيفية حساب وعرض هذه المواضيع “الأعلى”.

ملخص

  • يتم تعيين “نقاط عليا” لجميع المواضيع “العليا”
  • تستند النتيجة إلى الإعجابات والردود والمشاهدات خلال فترة زمنية محددة
  • تظهر المواضيع ذات “النقاط العليا” الأعلى في أعلى القائمة

حساب النقاط العليا

يتم حساب “النقاط العليا” للموضوع باستخدام العوامل التالية:

  1. عدد المشاهدات
  2. الإعجابات على المنشور الأول
  3. الإعجابات على المنشورات اللاحقة
  4. عدد الردود

يستخدم الحساب ثلاث إعدادات موقع مخفية كعوامل مضاعفة (هذه غير مرئية في واجهة إعدادات المسؤول، ولكن يمكن تغييرها عبر وحدة تحكم Rails أو واجهة برمجة التطبيقات):

  • top topics formula log views multiplier (القيمة الافتراضية: 2)
  • top topics formula first post likes multiplier (القيمة الافتراضية: 0.5)
  • top topics formula least likes per post multiplier (القيمة الافتراضية: 3)

خطوات الحساب

احسب النقاط العليا لكل موضوع عن طريق جمع ما يلي:

  1. لوغاريتم عدد المشاهدات (الحد الأدنى 1) لكل موضوع في الفترة المحددة، مضروبًا في log views multiplier
  2. عدد الإعجابات على المنشور الأصلي للموضوع مضروبًا في first post likes multiplier
  3. الأقل من:
    • متوسط الإعجابات لكل منشور (إجمالي الإعجابات على الموضوع مقسومًا على عدد المنشورات)
    • قيمة least likes per post multiplier
  4. إذا كانت الفترة تحتوي على أقل من 10 منشورات، قم بإجراء الحساب التالي:
    0 - ((10 - عدد المنشورات في الموضوع) / 20) * عدد الإعجابات على المنشور الأصلي
    
    وإلا، 10
  5. لوغاريتم عدد المنشورات (الحد الأدنى 1) في الموضوع

عرض المواضيع العليا

يمكنك رؤية مثال للمواضيع العليا في موقع Discourse في الصورة أدناه:

موارد إضافية

لمزيد من التفاصيل التقنية، يمكنك الرجوع إلى:

-- [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 إعجابًا

هل من الممكن تضمين ‘الأصوات’ في هذا الحساب؟

تم إخفاء هذه الآن حتى لا تراها في إعدادات الموقع