我有一个拥有大约 100,000 个独特页面的网站。
(1) 如何为所有这些链接创建站点地图?我应该将它们平放在一个大型站点地图协议兼容文件中吗?
(2) 需要在有 1000 项查询限制的 Google App Engine 上实现这一点,并且我所有的个人站点 URL 都存储为单独的条目。我该如何解决这个问题?
我有一个拥有大约 100,000 个独特页面的网站。
(1) 如何为所有这些链接创建站点地图?我应该将它们平放在一个大型站点地图协议兼容文件中吗?
(2) 需要在有 1000 项查询限制的 Google App Engine 上实现这一点,并且我所有的个人站点 URL 都存储为单独的条目。我该如何解决这个问题?
站点地图必须不超过 10MB,并且列出不超过 50,000 个 URL,因此您需要以某种方式将其分解。
您将需要某种分片策略。我不知道您的数据是什么样的,所以现在假设每次创建页面实体时,您都为其分配一个 1 到 500 之间的随机整数。
接下来,创建一个站点地图索引,并为每个索引值生成一个站点地图链接:
<?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>
最后,在您的站点地图页面上,查询页面并过滤您的随机索引。如果您有 100,000 个页面,那么每个站点地图将为您提供大约 200 个 URL。
这里稍微不同的策略是给每个页面一个自动递增的数字 ID。为此,您需要一个计数器对象,该对象在每次创建新页面时都被事务锁定并递增。这样做的缺点是您不能并行创建新的页面实体。好处是您可以更好地控制页面的布局方式,因为您的第一个站点地图可能是页面 1-1000,依此类推。
您可以使用Query Cursors来规避 1000 个查询项的限制;但是,即使使用游标也可能无法完全解决您的问题,因为生成包含 100,000 个项目的站点地图很容易超过允许运行单个请求的时间。此外,动态生成站点地图很容易用完您的全部或大量资源配额。
如果您的数据不是很动态,我会考虑生成一个静态站点地图文件并将其包含在您的部署包中。即使您的数据非常动态,您也可能希望采用每天仅重新生成一次并进行部署以将其放在服务器上的策略。
我遇到了类似的问题,但为了重新发明轮子,我刚刚插入了 Google Sitemap Generator http://sitemap-generators.googlecode.com/svn/trunk/docs/en/sitemap-generator.html。它对我有用,因为我的应用程序是基于 python 的。