2009-12-13 34 views
12

Recientemente utilicé la función de Wikipedia "Lo que enlaza aquí" (que se encuentra bajo el elemento "Caja de herramientas" en el menú de la izquierda de cualquier entrada) y me puse a pensar cómo funcionaría realmente esta función.
Supongo que buscar todas las entradas de artículos después de los enlaces no es muy efectivo, ¿así que todos los enlaces están almacenados en una base de datos separada? Si es así, ¿se actualiza cuando se edita un artículo o en otro momento?¿Cómo funciona el "enlace de Wikipedia" de Wikipedia?

Gracias.

Respuesta

15

Cada vez que se edita una página en Wikipedia, se coloca en una cola de fondo que procesa un poco más. Algunas de las cosas que suceden allí son:

  • cambios a las "Lo que enlaza aquí" para otras páginas
  • cambios a las páginas de índice categoría
  • cambios a la caché global de páginas existentes para contribuir a que la "redlinks "en otras páginas

Este tipo de información no necesita actualizarse de inmediato al presionar" Enviar ", por lo que la cola de procesamiento en segundo plano se ocupa de ello. A veces, esta cola puede crecer bastante, pero generalmente se mantiene bajo control.

Puede encontrar más información al respecto en Help:Job Queue.

1

La forma en que pondría en práctica es conseguir que todos los enlaces después de una edición, y luego almacenarlas en una tabla separada donde la clave es la URL actual. Entonces podría consultar la tabla con la URL en la que el usuario se encuentra actualmente y obtener todos los enlaces que se han marcado como enlaces a esa página.

Probablemente no sería tan sencillo, pero esa es la idea general y simplificada. Probablemente, en lugar de URL, sería más prudente almacenar ID de página, etc.

1

tendría sentido para el "evento de actualización" de un artículo para desencadenar un analizador de enlaces ya que es la única vez que un artículo se va a cambiar. El evento de actualización, a su vez, simplemente buscará enlaces y consultará el archivo db en busca de enlaces internos de wikipedia.

Imagino cada página tiene una clave principal y se crea una tabla de asociación simple de relacionar las páginas PK a todas las otras páginas que enlazan con ella.

Theres probablemente algunos bits adicionales que se añaden para ayudar a rendimiento en un sitio tan grande, pero que sería la mecánica básica.

2

Podría pensar que se trata de un problema más general. Si tiene un enlace (o un puntero o lo que sea) de A a B, ¿cómo puede saber B que A tiene un enlace apuntando allí?

La respuesta es almacenar la información en destino ubicación. Es decir, cuando se edita la página A y se crea un enlace para B, al mismo tiempo se almacena información sobre el origen del enlace en B (un enlace inverso). En el caso de una página web, el enlace inverso podría escribirse directamente en la página "lo que enlaza aquí". Solo una sola escritura en una página estática. No es necesario realizar ninguna búsqueda o consulta de base de datos.

2

pseudo código para un algoritmo simple que lo haría

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) 

En este momento acabo de terminar mi clase de algoritmos, así que tengo una necesidad de escribir código de pseudo.En este contexto, el procedimiento updateChanges() sería algo llamado durante la fase de "actualizar el 'lo que enlaza aquí' para otras páginas" al que se refirió Greg Hewgill.

Cuestiones relacionadas