我在GAE 搜索索引中有大约 400,000 个文档。所有文件都有一个location
GeoPoint
属性,并且分布在全球各地。一些文件可能与任何其他文件相距超过 4000 公里,而另一些文件可能彼此相距几米。
我想找到最接近特定坐标集的文档,但发现以下代码给出了不正确的结果:
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 来始终如一地完成此任务?