最初に少し背景を説明します。GeoModelは私が作成したライブラリであり、AppEngineアプリに非常に基本的な地理空間のインデックス作成とクエリ機能を追加します。ジオハッシュへのアプローチも同様です。GeoModelの同等のロケーションハッシュは「geocell」と呼ばれます。
現在、GeoModelライブラリは、13のプロパティ(location_geocell__n_、n = 1..13)を各ロケーション認識エンティティに追加します。たとえば、エンティティは次のようなプロパティ値を持つことができます。
location_geocell_1 = 'a'
location_geocell_2 = 'a3'
location_geocell_3 = 'a3f'
...
これは、空間クエリ中に不等式フィルターを使い果たしないようにするために必要です。
13プロパティのアプローチの問題は、アプリが実行したい地理クエリに対して、13の新しいインデックスを定義して構築する必要があることです。プロジェクトのデモアプリを書き直しているときに痛々しいほど気づいたので、これは間違いなくメンテナンスの手間です。これは私の最初の質問につながります:
質問1:インデックスごとに大きなストレージオーバーヘッドはありますか?つまり、それぞれにn個のエンティティを持つ13個のインデックスがあるのに対し、13n個のエンティティを持つ1個のインデックスがある場合、ストレージの点で前者は後者よりもはるかに悪いですか?
この記事によると、(1)の答えはノーのようですが、誰かが別の経験をしたことがあるかどうかを確認したいと思います。
ここで、GeoModelライブラリを調整して、13個の文字列プロパティの代わりにlocation_geocellsと呼ばれるStringListPropertyが1つだけになるようにすることを検討しています。
location_geocells = ['a', 'a3', 'a3f']
これにより、はるかにクリーンになりindex.yaml
ます。しかし、私はパフォーマンスへの影響に疑問を持っています:
質問2:13個の文字列プロパティから1個のStringListPropertyに切り替えると、クエリのパフォーマンスに悪影響があります。私の現在のフィルターは次のようになります。
query.filter('location_geocell_%d =' % len(search_cell), search_cell)
新しいフィルターは次のようになります。
query.filter('location_geocells =', search_cell)
最初のクエリには_n_エンティティの検索スペースがあり、2番目のクエリには_13n_エンティティの検索スペースがあることに注意してください。
(2)の答えは、このブログ投稿のヒント#6によると、どちらも同等のクエリパフォーマンスをもたらすようですが、これについても、実際の経験が異なる人がいないかどうかを確認したいと思います。
最後に、ストレージの使用率、クエリのパフォーマンス、使いやすさ(特に、wrt index.yaml)を改善するのに役立つ提案やヒントが他にある場合は、お知らせください。ソースはここにありますgeomodel&geomodel.py