我在GAE Search索引中有約400,000個文檔。所有文件都有一個location
GeoPoint
財產,並分佈在整個地球。有些文件可能距離任何其他文件超過4000公里,其他文件可能在彼此的米之內。如何使用Google App Engine搜索API找到最接近的文檔?
我想找到最接近的文件一組特定的座標,但發現下面的代碼會產生不正確的結果:
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
參數太大。如果半徑下降到12公里左右(radius=12000
),我會得到正確的結果。在12公里範圍內通常不會有超過1000個文件。 (可能與search.SortOptions(limit=1000)
有關。)
的問題是,如果我在地球上的某個區域稀疏那裏有沒有千里的任何文件,我的搜索功能將不能與radius=12000
(12公里)返回任何東西。無論我在哪裏,我都希望它將最接近的文檔返回給我。如何通過一次調用Search API來實現這一點?
感謝您確認@Middy和我推測在幕後發生了什麼。知道'命中'限制是10k肯定有幫助。爲了完成,我將陳述答案**我希望它能夠將最接近的文檔返回給我,無論我身在何處。我怎樣才能實現這一致的調用Search API?**是我不能一致如果我的搜索半徑_might_包含超過10k文件 - 不幸的是我的應用程序可能會做:( – Dan 2013-03-13 21:00:12