2010-07-07 66 views
4

我有一個擁有大約10萬個獨特頁面的網站。在Google App Engine上創建大型站點地圖?

(1)如何爲所有這些鏈接創建站點地圖?我應該將它們平放在一個大的站點地圖協議兼容文件中嗎? (2)需要在Google App Engine中實現此功能,其中有1000個商品查詢限制,並且我所有的單個網站網址均作爲單獨的條目存儲。我該如何解決這個問題?

回答

6

網站地圖不得大於10MB,並列出不超過50,000個網址,因此您需要以某種方式將其分解。

你將需要某種分片策略。我不知道你的數據是什麼樣的,所以現在讓我們假設你每次創建一個頁面實體時,都給它指定一個1到500之間的隨機整數。

接下來,創建一個Sitemap index,並吐出一個站點地圖鏈接爲您的每個索引值:

<?xml version="1.0" encoding="UTF-8"?> 
    <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <sitemap> 
     <loc>http://example.appspot.com/sitemap?random=1</loc> 
    </sitemap> 
    <sitemap> 
     <loc>http://example.appspot.com/sitemap?random=2</loc> 
    </sitemap> 
    ... 
    <sitemap> 
     <loc>http://example.appspot.com/sitemap?random=500</loc> 
    </sitemap> 
</sitemapindex> 

最後,在您的站點地圖頁上查詢頁面並過濾您的隨機索引。如果您有10萬個網頁,則每個網站地圖會提供約200個網址。

這裏略有不同的策略是給每個頁面一個自動遞增的數字ID。爲此,您需要一個計數器對象,每次創建新頁面時都會事務性鎖定並增加計數器對象。這個缺點是你不能並行創建新的頁面實體。好處在於,您可以更好地控制頁面佈局,因爲您的第一個站點地圖可能是1-1000頁,等等。

+0

太棒了!感謝讓我的生活更簡單:)我將在接下來的30分鐘內編碼:) – demos 2010-07-07 14:48:48

+0

不錯的策略!不過,在App Engine中使用遞增計數器通常是個不錯的主意。 – 2010-07-20 09:07:45

+0

有趣的做法 – systempuntoout 2011-07-18 20:54:18

0

您可以使用Query Cursors規避1000個查詢項目限制;儘管使用遊標可能不會完全解決您的問題,因爲生成一個包含100,000個項目的站點地圖可能會輕鬆超過允許單個請求運行的時間。另外,動態生成站點地圖可以輕鬆使用全部或大量的資源配額。

如果您的數據不是非常動態的,我會考慮生成一個靜態站點地圖文件並將其作爲您的部署包的一部分。即使你的數據是非常動態的,你也可能希望採用一種每天僅重新生成一次的策略,並進行部署以將其放到服務器上。