Executando verificação de segurança...
2

No falecido Chuvisco, eu fiz o "algoritmo" assim:

Cada comentário = 2 pontos
Cada upvote = 1 ponto
Pontos invisíveis = votos que o admin poderia dar para "upar" uma publicação

Pontos totais = (Pontos comentários + Pontos de upvote + Pontos invisíveis) - (tempo que passou da publicação em horas / 10)

Dessa forma, a cada 10 horas a publicação perdia pontuação no ranking e acabava tirando ela da página inicial caso ela não tivesse votos suficientes.

Carregando publicação patrocinada...
1

Show! No seu princípio, está próximo do TabNews que é uma briga entre os "pontos" e a "gravidade" (quanto tempo passou).

O algoritmo atual do TabNews abaixo foi ispirado nessa publicação: How Hacker News ranking algorithm works

  function getContentScore(contentObject) {
    const tabcoins = contentObject.tabcoins;
    const secondsSinceEpoch = Math.floor(new Date() / 1000);
    const publishedAtInSeconds = Math.floor(new Date(contentObject.published_at) / 1000);
    const ageInSeconds = secondsSinceEpoch - publishedAtInSeconds;
    const ageBase = 60 * 60 * 1; // 1 hour
    const boostPeriodInSeconds = 60 * 10; // 10 minutes
    const initialBoost = ageInSeconds < boostPeriodInSeconds ? 10 : 1;
    const tabcoinsAntiGravity = 1.5;
    const tabcoinsWithAntiGravity = Math.pow(Math.abs(tabcoins), tabcoinsAntiGravity);
    const tabcoinsWithCorrectSign = tabcoins > 0 ? tabcoinsWithAntiGravity : tabcoinsWithAntiGravity * -1;
    const gravity = 1.8;

    const scoreDecimals = (tabcoinsWithCorrectSign + initialBoost) / Math.pow(ageInSeconds + ageBase, gravity);
    const finalScore = scoreDecimals * 10000;
    return finalScore;
  }

Sendo que a regra principal é esta:

(tabcoinsWithCorrectSign + initialBoost) / Math.pow(ageInSeconds + ageBase, gravity)

Em resumo: uma força exponencial positiva das TabCoins contra uma força exponencial negativa da idade da publicação.

1
1

Esse é o maior problema do algoritmo, ele não faz o corte pelo banco de dados e não tem como "chegar na home".

O que se faz hoje é pegar as últimas 30 publicações (de forma decrescente) e nessa lista rodar o score e fazer a ordenação.

Como você fez isso no Chuvisco? Onde e quando acontece o rankeamento e a construção da lista final que vai para Home (e para a "Página 2)?

2

Como eu tinha poucos posts, e tava no começo, eu pegava todos os posts dos últimos 5 dias e ordenava, hahaha. Não era o mais performático...

Mas a minha ideia, quando começasse a ter muito post, era criar um Cron Job pra atualizar os pontos dos posts. Daí teria isso como um index no banco ou algo assim.

Eu tinha daí o link pra 3 "filtros" no site:

  • Home (os posts dos últimos 5 dias ranqueados)
  • Arquivo (posts com mais de 5 dias)
  • Novos (todos os posts dos últimos 2 dias ordenados por ondem de publicação)
1

Show! Gosto muito da ideia de anotar o score no próprio post, mas sempre que possível tento evitar o cron.

Vamos ver se vale a pena implementar isso de alguma forma num ambiente serverless 🤝