私は約 100,000 のユニークなページを持つサイトを持っています。
(1) これらすべてのリンクのサイトマップを作成するにはどうすればよいですか? それらを大きなサイトマッププロトコル互換ファイルにフラットにリストするだけですか?
(2) 1000 項目のクエリ制限がある Google App Engine でこれを実装する必要があり、個々のサイト URL はすべて個別のエントリとして保存されます。この問題を解決するにはどうすればよいですか?
私は約 100,000 のユニークなページを持つサイトを持っています。
(1) これらすべてのリンクのサイトマップを作成するにはどうすればよいですか? それらを大きなサイトマッププロトコル互換ファイルにフラットにリストするだけですか?
(2) 1000 項目のクエリ制限がある Google App Engine でこれを実装する必要があり、個々のサイト URL はすべて個別のエントリとして保存されます。この問題を解決するにはどうすればよいですか?
サイト マップは 10 MB 以下で、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 ページなどになる可能性があるため、ページのレイアウト方法をもう少し制御できることです。
同様の問題がありましたが、車輪を再発明する代わりに、Google Sitemap Generator http://sitemap-generators.googlecode.com/svn/trunk/docs/en/sitemap-generator.htmlをプラグインしました。私のアプリはpythonベースなので、うまくいきました。
クエリ カーソルを使用して、1000 個のクエリ アイテムの制限を回避できます。ただし、100,000 個のアイテムを含むサイトマップを生成すると、1 つの要求の実行が許可されている時間を簡単に超える可能性があるため、カーソルを使用しても問題を完全に解決できない可能性があります。また、サイトマップを動的に生成すると、リソース クォータのすべてまたは大量を簡単に使い果たしてしまう可能性があります。
データがあまり動的でない場合は、静的なサイトマップ ファイルを生成し、展開パッケージの一部として含めることを検討します。データが非常に動的であっても、1 日に 1 回だけデータを再生成し、デプロイを実行してサーバーに配置するという戦略を採用することをお勧めします。