2009-12-13 8 views
12

Recentemente ho usato la funzione di Wikipedia "Che collegamenti qui" (che si trova sotto l'elemento "Toolbox" nel menu di sinistra di qualsiasi voce) e mi ha fatto iniziare a chiedermi come funzioni effettivamente questa funzione.
Immagino che la ricerca di tutte le voci dell'articolo dopo i collegamenti non sia molto efficace, quindi tutti i collegamenti sono memorizzati in un database separato? In tal caso, questo è aggiornato quando un articolo viene modificato o un'altra volta?Come funziona "Quali collegamenti qui" di Wikipedia?

Grazie.

risposta

15

Ogni volta che una pagina su Wikipedia viene modificata, viene inserita in una coda di sfondo che esegue un'ulteriore elaborazione. Alcune delle cose che ci accadono sono:

  • aggiornamenti alle "Puntano qui" per le altre pagine
  • aggiornamenti di pagine di indice di categoria
  • aggiornamenti alla cache globale delle pagine esistenti per aiutare a rendere "redlinks "su altre pagine

Questo tipo di informazioni non ha bisogno di essere aggiornato immediatamente quando si preme" Invia ", quindi la coda di elaborazione in background si prende cura di esso. A volte questa coda può diventare abbastanza grande, ma di solito è tenuta sotto controllo.

È possibile trovare ulteriori informazioni a questo Help:Job Queue.

1

Il modo in cui implementare è ottenere tutti i collegamenti dopo una modifica, quindi memorizzarli in una tabella separata con la chiave che rappresenta l'URL corrente. Quindi potrei semplicemente interrogare la tabella con l'URL che l'utente è attualmente attivo e ottenere tutti i link che sono stati contrassegnati come link a quella pagina.

Probabilmente non sarebbe così semplice come quello, ma questa è l'idea generale e semplificata. Probabilmente al posto degli URL sarebbe più saggio archiviare gli ID delle pagine e così via.

1

Avrebbe senso per l '"evento di aggiornamento" di un articolo per attivare un parser di collegamenti poiché questa è l'unica volta che un articolo è destinato a cambiare. L'evento di aggiornamento, a sua volta, si limiterebbe a cercare i collegamenti e interrogare il db per i collegamenti interni a wikipedia.

Immagino che ogni pagina abbia una chiave primaria e che venga creata una semplice tabella di associazione per collegare le pagine PK a tutte le altre pagine che vi si collegano.

È probabile che alcuni bit aggiuntivi vengano aggiunti per migliorare le prestazioni in un sito così grande, ma sarebbe la meccanica di base.

2

Si potrebbe pensare che questo sia un problema più generale. Se si ha un collegamento (o un puntatore o qualsiasi altra cosa) da A a B, come può B sapere che A ha un collegamento che punta lì?

La risposta è per memorizzare le informazioni nella posizione target. Cioè, quando si modifica la pagina A e si crea un collegamento su B, si memorizzano allo stesso tempo le informazioni sull'origine del collegamento su B (un collegamento inverso). Nel caso di una pagina web, il link inverso potrebbe essere scritto direttamente nella pagina "che collegamenti qui". Basta una sola scrittura in una pagina statica. Non è necessario eseguire ricerche o query di database.

2

Pseudo codice per un semplice algoritmo che lo farebbe

procedure updateChanges(editedPage): 
    for_each(link on editedPage): 
     if(link is not to another wikipedia page): continue 
     pageToUpdate = open(link): 
     if(pageToUpdate->whatLinksHere.contains(editedPage)): continue 
     pageToUpdate->whatLinksHere.insert(editedPage) 

dispiace Ho appena finito la mia classe di algoritmi quindi ho voglia di scrivere codice pseudo.In questo contesto, la procedura updateChanges() potrebbe essere chiamata durante la fase di "aggiornamento dei collegamenti" per le altre pagine "a cui Greg Hewgill si riferiva.

Problemi correlati