Dan*_*Dan 6 google-app-engine python-2.7 gae-search
我在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)
Run Code Online (Sandbox Code Playgroud)
使用此代码,我将得到一致但不正确的结果.例如,搜索距离伦敦最近的文件表明最接近的文件在苏格兰.我已经证实有成千上万的文件.
我将问题缩小到radius参数太大.如果半径下降到12km左右,我得到的结果是正确的radius=12000.在12公里半径内通常不超过1000个文件.(可能与search.SortOptions(limit=1000).相关联.)
问题是,如果我在地球的一个稀疏区域,那里没有任何数千英里的文件,我的搜索功能将不会返回任何东西radius=12000(12km).无论我在哪里,我希望它能将最接近的文件归还给我.如何通过调用Search API始终如一地完成此操作?
我相信问题如下.您的查询将选择最多10K文档,然后根据距离排序表达式对其进行排序并返回.(也就是说,排序实际上并不是超过所有400k文档.)所以我怀疑这个10k选择中不包含一些地理位置较近的点.这就是为什么当您缩小搜索半径时事情会更好,因为您在该半径中的总点数较少.
从本质上讲,您希望以对您查询的内容有意义的方式将查询"命中"降低到10k.您可以通过以下几种方式解决此问题,您可以将它们组合在一起:
(我不相信这个10k阈值目前在Search API文档中;我已经提交了一张票来添加它).
| 归档时间: |
|
| 查看次数: |
912 次 |
| 最近记录: |