Comment personnaliser l'algorithme de score des sujets populaires avec un plugin ?

L’algorithme intégré de tri par popularité (Hot sorting) est très simple et pourrait ne pas convenir à différents cas d’utilisation. D’après ma compréhension de base de la base de code de Discourse, il n’existe actuellement aucun paramètre de site visible par l’utilisateur ni de point d’injection de plugin approprié pour personnaliser l’algorithme de tri par popularité. Il existe un événement topic_hot_scores_updated, mais il est appelé après la mise à jour des scores, ce qui sert à la notification sans la possibilité de remplacer les scores de popularité intégrés. Il existe deux paramètres de site, hot_topics_gravity et hot_topics_recent_days, mais ils ont la valeur hidden: true et ne sont pas visibles dans l’interface d’administration.

Nous envisageons d’écrire un plugin pour remplacer l’algorithme de score de popularité intégré. Quelle approche serait préférable en termes de compatibilité et de facilité de mise à niveau de Discourse à l’avenir ? Voici quelques-unes de mes idées :

  • Faire un monkey-patch de TopicHotScore et mettre à jour la base de données selon notre algorithme personnalisé.
  • Créer une table séparée pour stocker les scores de popularité des sujets et exécuter une tâche d’arrière-plan distincte pour les mettre à jour. Ajouter une autre route (au lieu de /hot) pour notre liste personnalisée de sujets populaires.
  • Ou peut-être que la base de code de Discourse pourrait être améliorée pour prendre en charge un tel cas d’utilisation ?
1 « J'aime »

Le plus simple, mais potentiellement limité selon ce que vous voulez faire.

Faisable mais plus complexe. Jetez un œil à la manière dont TopicQuery implémente les listes

et spécifiquement

  def list_hot
    create_list(:hot, unordered: true, prioritize_pinned: true) do |topics|
      topics = remove_muted(topics, user, options)
      topics.joins("JOIN topic_hot_scores on topics.id = topic_hot_scores.topic_id").order(
        "topic_hot_scores.score DESC",
      )
    end
  end

Vous pouvez en ajouter une supplémentaire relativement facilement, bien qu’il y ait pas mal de pièces mobiles à prendre en compte. Je l’ai fait dans mon plugin ‘homepage-filter’ et cela pourrait être un bon point de départ.