维基百科的“这里有什么链接”如何运作?

时间:2009-12-13 22:21:38

标签: mediawiki wikipedia

我最近使用了维基百科的功能“这里有什么链接”(可以在任何条目的左侧菜单中的“工具箱”元素下找到),它让我开始想知道这个功能是如何工作的。
我猜测在链接之后搜索所有文章条目不是很有效,那么所有链接都存储在一个单独的数据库中吗?如果是,那么在编辑文章或其他时间时这会更新吗?

感谢。

5 个答案:

答案 0 :(得分:16)

每当编辑维基百科上的页面时,它都会被放入后台队列中,以进行进一步处理。发生在那里的一些事情是:

  • 更新其他网页的“此处链接”
  • 更新类别索引页
  • 更新现有网页的全局缓存,以帮助在其他网页上呈现“红色链接”

当您点击“提交”时,不需要立即更新此类信息,因此后台处理队列负责处理。有时这个队列会变得非常大,但通常它会受到控制。

您可以在Help:Job Queue找到更多相关信息。

答案 1 :(得分:2)

你可以认为这是一个更普遍的问题。如果你有一个从A到B的链接(或指针或其他),B怎么知道A有一个指向那里的链接?

答案是将信息存储到目标位置。也就是说,当编辑页面A并且向B创建链接时,同时将关于链接源的信息存储到B(反向链接)。在网页的情况下,反向链接可以直接写入“这里的链接”页面。只需一次写入静态页面。无需执行任何搜索或数据库查询。

答案 2 :(得分: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()程序将在Greg Hewgill所提及的“更新'其他页面的链接”阶段期间调用。

答案 3 :(得分:1)

我要实现的方法是在编辑后获取所有链接,然后将它们存储在一个单独的表中,其中键是当前URL。然后,我可以使用用户当前所在的URL查询该表,并获取已标记为链接到该页面的所有链接。

它可能不会那么简单,但这是一般的,简化的想法。可能不是URL而是存储页面ID等等更明智。

答案 4 :(得分:1)

文章的“更新事件”触发链接解析器是有意义的,因为这是文章发生变化的唯一时间。反过来,update事件只会扫描链接,并在数据库中查询维基百科内部的链接。

我想每个页面都有一个主键,并创建一个简单的关联表,将页面PK与链接到它的所有其他页面相关联。

可能会增加一些额外的位来帮助在如此大的网站上提供性能但这将是基本的机制。