2009-12-13 2 views
12

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

Спасибо.

ответ

15

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

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

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

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

1

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

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

1

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

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

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

2

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

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

2

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

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

Смежные вопросы