我最近使用了維基百科的功能「什麼鏈接在這裏」(在任何條目的左側菜單中的「工具箱」元素下找到),它讓我開始想知道這個功能是如何工作的。
我猜測,通過鏈接後搜索所有文章條目不是很有效,所以所有的鏈接存儲在一個單獨的數據庫?如果是這樣,那麼在編輯文章或其他時間時更新?維基百科的「鏈接到這裏」是如何工作的?
謝謝。
我最近使用了維基百科的功能「什麼鏈接在這裏」(在任何條目的左側菜單中的「工具箱」元素下找到),它讓我開始想知道這個功能是如何工作的。
我猜測,通過鏈接後搜索所有文章條目不是很有效,所以所有的鏈接存儲在一個單獨的數據庫?如果是這樣,那麼在編輯文章或其他時間時更新?維基百科的「鏈接到這裏」是如何工作的?
謝謝。
每當維基百科上的某個頁面被編輯時,它將被放置在一個後臺隊列中,並進行一些進一步的處理。有些是發生在那裏的事情是:
當您點擊」提交「時,此類信息不需要立即更新,因此後臺處理隊列負責處理它。有時候這個隊列可能會變得很大,但通常情況下它會保持在控制之下。
你可以在Help:Job Queue找到更多關於這方面的信息。
我要實現的方式是在編輯後獲取所有鏈接,然後將它們存儲在單獨的表中,其中鍵爲當前url。然後,我可以使用用戶當前所在的URL查詢表格,並獲取所有已標記爲鏈接到該頁面的鏈接。
它可能不會那麼直截了當,但這是一般的,簡化的想法。可能而不是網址,它會更聰明地存儲頁面ID等。
對於文章的「更新事件」來說,觸發鏈接解析器是有意義的,因爲這是文章將要改變的唯一時間。更新事件反過來會簡單地掃描鏈接,並查詢數據庫中維基百科內部的鏈接。
我想每個頁面都有一個主鍵,並創建一個簡單的關聯表來將頁面PK與所有其他頁面鏈接到一起。
這些可能會添加一些額外的位來幫助在如此大的網站上執行性能,但這將是基本的機制。
你可以認爲這是一個更普遍的問題。如果您有從A到B的鏈接(或指針或其他),B怎麼知道A有鏈接指向?
答案是存儲信息到目標位置。也就是說,當頁面A被編輯並且鏈接被創建爲B時,同時將關於鏈接源的信息存儲到B(反向鏈接)。如果是網頁,反向鏈接可以直接寫入「此處鏈接」頁面。只需一次寫入靜態頁面。無需執行任何搜索或數據庫查詢。
僞爲一種簡單的算法會做代碼它
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提到的「更新'其他頁面」鏈接的階段。