Как работают ссылки Википедии «Что здесь»?

Недавно я воспользовался функцией Википедии "Какие здесь ссылки" (она находится в элементе "Панель инструментов" в левом меню любой записи), и это заставило меня задуматься, как эта функция на самом деле работает.
Я предполагаю, что поиск по всем записи статей после ссылок не очень эффективны, поэтому все ссылки хранятся в отдельной базе данных? Если да, обновляется ли он при редактировании статьи или в другой раз?

Спасибо.


person ehm    schedule 13.12.2009    source источник


Ответы (5)


Всякий раз, когда страница в Википедии редактируется, она помещается в фоновую очередь, которая выполняет некоторую дальнейшую обработку. Вот некоторые из вещей, которые там происходят:

  • обновления к "какие здесь ссылки" для других страниц
  • обновления индексных страниц категорий
  • обновления глобального кеша существующих страниц, чтобы помочь отображать «красные ссылки» на других страницах.

Такого рода информацию не нужно обновлять сразу после нажатия кнопки «Отправить», поэтому об этом позаботится очередь фоновой обработки. Иногда эта очередь может стать довольно большой, но обычно ее держат под контролем.

Дополнительную информацию об этом можно найти в Help:Job Queue.

person Greg Hewgill    schedule 13.12.2009

Можно подумать, что это более общая проблема. Если у вас есть ссылка (или указатель или что-то еще) из A в B, как B может знать, что A имеет ссылку, указывающую туда?

Ответ заключается в том, чтобы хранить информацию в целевом местоположении. То есть, когда редактируется страница А и создается ссылка на Б, одновременно сохраняется информация об источнике ссылки на Б (обратная ссылка). В случае веб-страницы обратная ссылка может быть написана непосредственно на странице «что здесь ссылки». Всего одна запись на статическую страницу. Нет необходимости выполнять какие-либо поиски или запросы к базе данных.

person PauliL    schedule 14.12.2009

Псевдокод для простого алгоритма, который бы это сделал

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)

Извините, я только что закончил свой класс алгоритмов, поэтому у меня есть желание писать псевдокод. В этом контексте процедура updateChanges() будет вызываться на этапе «обновления ссылок на другие страницы», о котором говорил Грег Хьюгилл.

person Graphics Noob    schedule 14.12.2009

Я бы реализовал так, чтобы получить все ссылки после редактирования, а затем сохранить их в отдельной таблице с ключом, являющимся текущим URL-адресом. Затем я мог бы просто запросить таблицу с URL-адресом, по которому в данный момент находится пользователь, и получить все ссылки, которые были отмечены как ссылки на эту страницу.

Вероятно, это было бы не так просто, но это общая, упрощенная идея. Вероятно, вместо URL-адресов было бы разумнее хранить идентификаторы страниц и так далее.

person Tatu Ulmanen    schedule 13.12.2009

Было бы разумно, чтобы «событие обновления» статьи запускало анализатор ссылок, поскольку это единственный раз, когда статья будет меняться. Событие обновления, в свою очередь, будет просто сканировать ссылки и запрашивать в базе данных ссылки, которые являются внутренними для Википедии.

Я предполагаю, что у каждой страницы есть первичный ключ, и создается простая таблица ассоциаций, чтобы связать страницы PK со всеми другими страницами, которые ссылаются на нее.

Вероятно, есть некоторые дополнительные элементы, которые добавляются для повышения производительности на таком большом сайте, но это будет основная механика.

person rism    schedule 13.12.2009