GAE検索インデックスに約400,000のドキュメントがあります。すべてのドキュメントにはlocation
GeoPoint
プロパティがあり、世界中に広がっています。一部のドキュメントは他のドキュメントから4000km以上離れている場合があり、その他のドキュメントは互いに数メートル以内に集まっている場合があります。
特定の座標セットに最も近いドキュメントを見つけたいのですが、次のコードで間違った結果が得られます。
from google.appengine.api import search
# coords are in the form of a tuple e.g. (50.123, 1.123)
search.Document(
doc_id='meaningful-unique-id',
fields=[search.GeoField(name='location'
value=search.GeoPoint(coords[0], coords[1]))])
# find document function radius is in metres
def find_document(coords, radius=1000000):
sort_expr = search.SortExpression(
expression='distance(location, geopoint(%.3f, %.3f))' % coords,
direction=search.SortExpression.ASCENDING,
default_value=0)
search_query = search.Query(
query_string='distance(location, geopoint(%.3f, %.3f)) < %d' \
% (coords[0], coords[1], radius),
options=search.QueryOptions(
limit=1,
ids_only=True,
sort_options=search.SortOptions(expressions=[sort_expr])))
index = search.Index(name='document-index')
return index.search(search_query)
このコードを使用すると、一貫性はあるが正しくない結果が得られます。たとえば、ロンドンに最も近いドキュメントを検索すると、最も近いドキュメントはスコットランドにあることがわかりました。私は何千ものより近い文書があることを確認しました。
radius
パラメータが大きすぎることに問題を絞り込みました。半径が約12km()まで下がると正しい結果が得られますradius=12000
。通常、半径12kmには1000を超えるドキュメントはありません。(おそらくに関連付けられていsearch.SortOptions(limit=1000)
ます。)
問題は、私が地球のまばらな地域にいて、何千マイルもドキュメントがない場合、検索機能がradius=12000
(12km)で何も返さないことです。どこにいても、最も近いドキュメントを返してほしい。Search APIを1回呼び出すだけで、これを一貫して達成するにはどうすればよいですか?