Domanda

Ogni prodotto un product_date_added che è un campo Date conteneva la data in cui è stata aggiunta. Essi hanno anche un product_views che è un campo int contenente quante volte un prodotto è stato visualizzato.

Per visualizzare i prodotti per popolarità, mi ci ha un algoritmo per calcolare quanti colpi al giorno un prodotto ha.

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

Questo funziona, ma il boss sta notando un sacco di prodotti più vecchi che mostrano per primo. Così vuole fondamentalmente vista più recenti di avere più peso di vista più anziani.

Il suo suggerimento era che tutte le viste più di un anno non contano. Penso che avrei dovuto mantenere la data di ogni vista, al fine di farlo, che penso avrebbe rallentare le prestazioni.

Qual è il modo migliore per creare un algoritmo di popolarità come quello che il mio capo sta chiedendo?

Idealmente vorrei essere in grado di trovare qualcosa che non altera la struttura della tabella. Se ciò non fosse possibile, vorrei almeno come a venire con una soluzione che può utilizzare i dati esistenti in modo non partiamo da 0. Se quello non è possibile, né di qualsiasi altra cosa che funziona.

È stato utile?

Soluzione

non sarebbe (come tale) devono mantenere la data di ogni vista. Si potrebbe invece continuare fino a 366 righe per elemento in una tabella con colonne: product_id, DAY_OF_YEAR, conteggio. Ogni giorno eseguire un compito a zero tutti i conteggi da un anno fa. Se non ti dispiace di dati denormalizzato, questo compito potrebbe anche aggiornare il campo "contare" nella voce di sé per il recupero veloce, in modo che la query non ha bisogno di cambiamento. product_views diventa solo product_views_in_the_last_year. Il periodo di tempo di 1 giorno è arbitrario - dubito vi preoccupate che la popolarità è basata su una finestra di precisione 1 anno, quindi mi aspetto che potrebbe benissimo essere un'ora, una settimana o quindici giorni, a seconda quanti secchi voi' ri disposti a trattare con.

, una strategia alternativa potrebbe essere quella di utilizzare decadimento esponenziale. Girare il campo di conteggio in un tipo decimale. Una volta al giorno, ridurre il conteggio di ciascun elemento di una percentuale fissa (meno dell'1%, più dello 0,1%), in modo che il colpo una più recente, più "peso" che ha. Così vecchio popolarità non muore mai del tutto, ma colpi da un anno fa, non contribuirà molto. Un equivalente a questo schema, tra l'altro, è quello di lasciare il codice come è, ma garantire che il vostro sito web nel suo complesso diventa esponenzialmente più popolare nel corso del tempo; -)

Per quanto riguarda evitare partendo da zero - forse ridurre il numero di ogni articolo immediatamente, come un one-off azione, da una parte, che dipende dall'età della voce. Nel complesso ci si aspetta che gli oggetti più anziani hanno la vista più anziani, e quindi sono sopravvalutato dal regime corrente. Questo non è infallibile, dal momento che forse alcuni elementi più vecchi hanno recentemente guadagnato un sacco di colpi. Potreste essere in grado di identificare questi elementi, cercando in recenti log del server web, oppure trascorrere una settimana o un mese colpi di conteggio prima di fare l'una tantum di riduzione. Anche senza fare che, se c'è una ragione fondamentale per la loro popolarità (e non solo perché sono attualmente elevato grado di vostra classifica e, quindi, ricevere traffico da parte di persone guardando il grafico "più popolare"), quindi speriamo che riprenderà dato il tempo .

Altri suggerimenti

Si potrebbe voler controllare questo post del blog . E 'rivolto a App Engine, ma la tecnica è generale. L'approccio di base è quello di avere una popolarità che decade esponenzialmente, e viene incrementato ogni volta che si registra un voto / download / qualunque cosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top