我在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