Question

Chaque produit un product_date_added qui est un champ de Date contenait la date a été ajouté. Ils ont aussi un product_views qui est un champ contenant int combien de fois un produit a été vue.

Pour afficher les produits par popularité, je nous un algorithme pour calculer le nombre de visites par jour, un produit a.

SELECT 
    AVG(product_views / DATEDIFF(NOW(), product_date_added)) as avg_hits
    , product_table.* 
FROM product_table
WHERE product_available = "yes" 
GROUP BY product_id
ORDER BY avg_hits DESC

Cela fonctionne, mais le patron est remarqué un grand nombre de produits plus anciens montrant en premier. Il veut donc essentiellement des vues plus récentes pour avoir plus de poids que des vues plus.

Il a suggéré que toute vue sur un an ne comptent pas. Je pense que je devrais garder une date de chaque point de vue afin de le faire, que je pense ralentirait la performance.

Quelle est la meilleure façon de créer un algorithme de popularité comme ce que mon patron réclame?

Idéalement, je veux être en mesure de trouver quelque chose qui ne modifie pas la structure de la table. Si cela est impossible, je voudrais au moins arriver à une solution qui peut utiliser les données existantes pour que nous ne partons pas de 0. Si c'est pas possible non plus que tout ce qui fonctionne.

Était-ce utile?

La solution

Vous ne voudriez pas (en tant que telle) doivent maintenir la date de chaque point de vue. Vous pourriez plutôt conserver jusqu'à 366 lignes par élément dans une table avec des colonnes: product_id, day_of_year, comte. Chaque jour exécuter une tâche à zéro tous les comptes d'il y a un an. Si cela ne vous dérange pas de données dénormalisé, cette tâche pourrait également mettre à jour le champ « compte » dans l'article lui-même pour une récupération rapide, de sorte que votre requête n'a pas besoin de changement. product_views devient juste product_views_in_the_last_year. La période de temps de 1 jour est arbitraire - je doute soin vous que la popularité est basée sur une fenêtre de précision 1 an, donc je pense qu'il pourrait tout aussi bien être une heure, une semaine ou une quinzaine de jours, selon le nombre de seaux vous » êtes prêt à traiter.

Un autre schéma pourrait être utiliser décroissance exponentielle. Tourner le champ de comptage dans un type décimal. Une fois par jour, de réduire le nombre de chaque élément d'un pourcentage fixe (moins de 1%, plus de 0,1%), de sorte que l'une frappe plus récente, plus de « poids » dont il dispose. Si vieux popularité ne meurt jamais tout à fait, mais de succès il y a un an ne contribuera pas beaucoup. Un équivalent à ce régime, en passant, est de laisser le code tel qu'il est mais assurez-vous que votre site dans son ensemble devient exponentiellement plus populaire au fil du temps; -)

Quant à éviter à partir de zéro - peut-être réduire le nombre de chaque élément immédiatement, comme unique action par une proportion qui dépend de l'âge de l'élément. Dans l'ensemble, vous vous attendez que les objets anciens ont des vues plus âgés, et sont donc surestimée par le régime actuel. C'est pas infaillible, car peut-être quelques éléments plus anciens ont récemment gagné beaucoup de coups. Vous pourriez être en mesure d'identifier ces éléments en regardant les journaux de serveur Web récents, ou en passant une semaine ou un succès de comptage mois avant de faire l'unique réduction. Même sans cela, s'il y a une raison fondamentale de leur popularité (et pas seulement parce qu'ils sont actuellement cote élevée au regard de votre classement et recevant donc le trafic de personnes regardant votre « plus populaire » graphique), alors espérons qu'ils se rétablissent donner le temps .

Autres conseils

Vous pouvez consulter ce blog . Il est destiné à App Engine, mais la technique est générale. L'approche de base est d'avoir une popularité qui diminue de manière exponentielle, et est incrémentée chaque fois que vous enregistrez un vote / téléchargement / whatever.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top