背景の最初のビット:GeoModelは、App Engineアプリケーションに非常に基本的なジオスペースインデックスとクエリー機能を追加するライブラリです。それは、ジオハッシングと同様のアプローチです。 GeoModelの等価ロケーションハッシュは「geocell」と呼ばれます。App Engine:13 StringPropertysと1 StringListProperty(インデックス/ストレージとクエリのパフォーマンス)
現在、GeoModelライブラリは13個のプロパティ(location_geocell__n_、n = 1..13)を各位置認識エンティティに追加します。
location_geocell_1 = 'a'
location_geocell_2 = 'a3'
location_geocell_3 = 'a3f'
...
これは、空間クエリ中不等式フィルタを使用しないために必要とされる:例えば、エンティティは、次のようなプロパティ値を有することができます。
13プロパティアプローチの問題は、アプリケーションが実行したいジオクエリの場合、13の新しいインデックスを定義して構築する必要があるということです。これは間違いなくメンテナンスの手間であり、プロジェクトのデモアプリケーションを書き直しながら痛感しているだけです。これが私の最初の質問につながる:
QUESTION 1:インデックスあたりの重大なストレージ・オーバーヘッドがありますか?つまり、それぞれにn個のエンティティを持つ13個のインデックスがあるのに対し、13n個のエンティティを持つ1個のインデックスは、前者がストレージに関して後者よりずっと悪くなっていますか?
答えは(1)はいいえ、this articleであると思いますが、誰かが別の経験をしているかどうかを確認したいと思います。
さて、私はGeoModelライブラリを調整検討しているように代わりに13文字列プロパティの、一つだけStringListPropertyはすなわち、location_geocellsが呼び出されると思います。:
location_geocells = ['a', 'a3', 'a3f']
これはindex.yaml
ずっときれいになります。しかし、私は、パフォーマンスへの影響を質問します:
QUESTION 2:私は13の文字列プロパティから1 StringListPropertyに切り替えると、パフォーマンスの悪影響を受けることを照会します。私の現在のフィルタは、次のようになります。
query.filter('location_geocell_%d =' % len(search_cell), search_cell)
と新しいフィルタは次のようになります。2番目のクエリが持っているのに対し、最初のクエリは、_N_実体の探索空間を持っていることを
query.filter('location_geocells =', search_cell)
注意_13n_エンティティの検索スペース。
(2)の回答のようですが、両方ともthis blog postのヒントごとに6となりますが、もう一度、誰かがこれと実際に異なる体験をしているかどうかを確認したいと思います。
最後に、ストレージ利用率、クエリパフォーマンス、使いやすさ(特にw.r.t. index.yaml)を向上させるためのヒントやヒントがある場合は、教えてください。ソースはここgeomodel & geomodel.py
さまざまなプロパティの種類とインデックス行の保存容量の詳細:http://code.google.com/appengine/articles/storage_breakdown.html – ryan