Подтвердить что ты не робот

Как работает Wikipedia "Какие ссылки здесь"?

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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() была бы вызвана во время "обновления ссылок на другие страницы", на которые ссылался Грег Хьюглилл.

Ответ 4

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

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

Ответ 5

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

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

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